rumdl 0.0.166__tar.gz → 0.0.167__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.166 → rumdl-0.0.167}/.config/nextest.toml +10 -7
- {rumdl-0.0.166 → rumdl-0.0.167}/.pre-commit-config.yaml +2 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/.rumdl.toml +3 -3
- {rumdl-0.0.166 → rumdl-0.0.167}/CHANGELOG.md +77 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/Cargo.lock +1 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/Cargo.toml +1 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/Makefile +2 -2
- {rumdl-0.0.166 → rumdl-0.0.167}/PKG-INFO +1 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md013.md +20 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md033.md +18 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md053.md +59 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/config.rs +171 -19
- {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/mod.rs +2 -2
- {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/server.rs +659 -40
- {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/types.rs +377 -13
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md013_line_length.rs +145 -6
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md022_blanks_around_headings.rs +32 -31
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md033_no_inline_html.rs +18 -66
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md035_hr_style.rs +6 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md051_link_fragments.rs +6 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md053_link_image_reference_definitions.rs +158 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md054_link_image_style.rs +0 -11
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md055_table_pipe_style.rs +6 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/github.rs +9 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/text_reflow.rs +184 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/advanced_integration_tests.rs +1 -1
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_tests.rs +16 -7
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/init_tests.rs +2 -2
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/real_world_repository_tests.rs +19 -2
- {rumdl-0.0.166 → rumdl-0.0.167}/.mise.toml +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/.rustfmt.toml +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/CONTRIBUTING.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/LICENSE +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/MANIFEST.in +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/README.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/assets/logo.png +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benches/range_performance.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/cliff.toml +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/RULES.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/global-settings.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/inline-configuration.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md001.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md002.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md003.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md004.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md005.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md006.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md007.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md009.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md010.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md011.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md012.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md014.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md018.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md019.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md020.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md021.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md022.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md023.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md024.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md025.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md026.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md027.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md028.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md029.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md030.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md031.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md032.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md034.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md035.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md036.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md037.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md038.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md039.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md040.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md041.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md042.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md043.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md044.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md045.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md046.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md047.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md048.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md049.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md050.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md051.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md052.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md054.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md055.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md056.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md057.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/md058.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/pyproject.toml +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/__init__.py +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/__main__.py +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/py.typed +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rumdl.schema.json +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rumdl.toml.example +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/rust-toolchain.toml +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/cache.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/exit_codes.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/file_processor.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/filtered_lines.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/fix_coordinator.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/formatter.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/inline_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/lib.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/lint_context.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/main.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/output/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/parallel.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/performance.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/profiling.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rule.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rule_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/stdin_processor.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/jekyll.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/kramdown.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/header_id_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/jinja_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/line_ending.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_admonitions.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_common.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_critic.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_footnotes.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_patterns.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_snippets.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_tabs.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_test_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocstrings_refs.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/skip_context.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/vscode.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/src/watch.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/code_block_blockquote_edge_cases.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_upward_traversal_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/crlf_line_endings_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/exclude_with_explicit_paths_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/fix_counting_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/fix_performance_baseline_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/html_comments_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lib.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_formatting_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_initialization_options_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_mkdocs_flavor_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_unopened_document_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md009_md013_integration_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md009_md013_order_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_hard_breaks_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_reflow_nested_lists_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md032_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md032_ordered_list_bug_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md033_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md037_xxxx_regression_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md038_false_positive_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_readme_bug_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_toc_bug_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md052_literal_brackets_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/md054_code_span_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/mkdocs_anchor_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/mkdocs_anchor_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/per_file_ignores_integration_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/perf_check.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_dynamic_indent_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md028_md009_interaction_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_code_block_separation_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_fix_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_issue42_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_nested_list_continuation_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_blockquote_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_comprehensive_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_property_based_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_regression_prevention_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_unicode_security_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_admonitions_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_extensions_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_snippets_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/rule_interaction_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/schema_validation_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/sentence_per_line_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_ast_code_block_issue.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_gfm_vs_default_parsing.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_lint_context_flow.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_list_ast_structure.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_multiline_ast.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_underscore_edge_cases.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/unfixable_rules_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utf8_boundary_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_windows_test.rs +0 -0
|
@@ -22,21 +22,24 @@ status-level = "pass"
|
|
|
22
22
|
|
|
23
23
|
[profile.ci]
|
|
24
24
|
|
|
25
|
-
# Skip performance tests in CI (they're flaky due to resource variability)
|
|
25
|
+
# Skip performance and memory tests in CI (they're flaky due to resource variability)
|
|
26
26
|
# Exclude specific integration test binaries and performance-related test functions
|
|
27
|
-
default-filter = 'not (package(rumdl) and binary(deeply_nested_lists_performance_test)) and not (package(rumdl) and binary(performance_validation_tests)) and not (package(rumdl) and binary(perf_check)) and not test(/performance|benchmark/)'
|
|
27
|
+
default-filter = 'not (package(rumdl) and binary(deeply_nested_lists_performance_test)) and not (package(rumdl) and binary(performance_validation_tests)) and not (package(rumdl) and binary(perf_check)) and not test(/performance|benchmark|memory/)'
|
|
28
28
|
|
|
29
29
|
# More conservative in CI
|
|
30
30
|
test-threads = "num-cpus"
|
|
31
31
|
|
|
32
|
-
#
|
|
32
|
+
# Show failures immediately, but minimize successful test output for speed
|
|
33
33
|
failure-output = "immediate"
|
|
34
|
-
success-output = "
|
|
35
|
-
status-level = "
|
|
34
|
+
success-output = "final"
|
|
35
|
+
status-level = "pass"
|
|
36
36
|
|
|
37
37
|
# No retries in CI to catch flaky tests
|
|
38
38
|
retries = 0
|
|
39
39
|
|
|
40
|
+
# Fail fast on first failure to save CI time
|
|
41
|
+
fail-fast = true
|
|
42
|
+
|
|
40
43
|
# Quick profile for development
|
|
41
44
|
[profile.quick]
|
|
42
45
|
|
|
@@ -88,8 +91,8 @@ fail-fast = true
|
|
|
88
91
|
# Performance testing profile - for scheduled/manual runs
|
|
89
92
|
[profile.performance]
|
|
90
93
|
|
|
91
|
-
# Only run performance and
|
|
92
|
-
default-filter = 'test(performance) or test(benchmark) or test(deeply_nested)'
|
|
94
|
+
# Only run performance, benchmark, and memory tests
|
|
95
|
+
default-filter = 'test(performance) or test(benchmark) or test(deeply_nested) or test(memory)'
|
|
93
96
|
|
|
94
97
|
# Run tests serially to reduce noise
|
|
95
98
|
test-threads = 1
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
# pre-commit run --hook-stage push --all-files # Run push hooks
|
|
9
9
|
# pre-commit run --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG
|
|
10
10
|
|
|
11
|
+
fail_fast: true
|
|
12
|
+
|
|
11
13
|
repos:
|
|
12
14
|
# Conventional Commits validation
|
|
13
15
|
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
@@ -8,11 +8,11 @@ include = [
|
|
|
8
8
|
]
|
|
9
9
|
# Globally disable specific rules
|
|
10
10
|
disable = ["MD033"]
|
|
11
|
-
|
|
11
|
+
respect-gitignore = true
|
|
12
12
|
|
|
13
13
|
[MD013]
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
line-length = 200
|
|
15
|
+
code-blocks = true
|
|
16
16
|
tables = false
|
|
17
17
|
headings = true
|
|
18
18
|
reflow = true
|
|
@@ -7,6 +7,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.167] - 2025-10-24
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Configuration validation with fuzzy-match suggestions**
|
|
15
|
+
- Comprehensive unknown key detection for `.rumdl.toml` and `pyproject.toml`
|
|
16
|
+
- Intelligent "did you mean?" suggestions using Levenshtein distance algorithm
|
|
17
|
+
- File path context in validation warnings for easy debugging
|
|
18
|
+
- Catches typos in global options, rule names, and rule options
|
|
19
|
+
- Example: `line-lenght` → suggests `line-length`, `reflw` → suggests `reflow`
|
|
20
|
+
- Zero-dependency implementation with configurable similarity threshold
|
|
21
|
+
- Helps users catch configuration mistakes before they cause confusion
|
|
22
|
+
|
|
23
|
+
- **MD053: Support for community comment-style references**
|
|
24
|
+
- Recognizes and ignores reference-style link syntax used as comments
|
|
25
|
+
- Supports widely-used patterns: `[//]: # (comment)`, `[comment]: #`, `[note]: #`, `[todo]: #`, `[fixme]: #`, `[hack]: #`
|
|
26
|
+
- Any reference with just `#` as URL is treated as a comment
|
|
27
|
+
- While not in CommonMark/GFM specs, used across 23+ markdown implementations
|
|
28
|
+
- Complements HTML comments with a less HTML-like syntax option
|
|
29
|
+
- Improves compatibility with existing markdown practices
|
|
30
|
+
|
|
31
|
+
- **MD013: `line-length = 0` to disable all line length checks**
|
|
32
|
+
- Setting `line-length = 0` now completely disables MD013 rule
|
|
33
|
+
- Provides explicit way to turn off line length validation entirely
|
|
34
|
+
- More intuitive than previous workarounds
|
|
35
|
+
- Useful when line length management is handled by other tools or not desired
|
|
36
|
+
|
|
37
|
+
- **MD051: mdbook template support**
|
|
38
|
+
- Added detection and slug generation for mdbook templates
|
|
39
|
+
- Recognizes `{{#template path/to/file.md}}` syntax
|
|
40
|
+
- Properly generates GitHub-compatible slugs for template-included headings
|
|
41
|
+
- Improves compatibility with mdbook documentation projects
|
|
42
|
+
|
|
43
|
+
- **LSP: Manual "Reflow paragraph" code action for MD013 warnings**
|
|
44
|
+
- New code action available for MD013 line length warnings when auto-reflow is disabled
|
|
45
|
+
- Allows users to manually reflow specific paragraphs without enabling global reflow in config
|
|
46
|
+
- Appears as "Reflow paragraph" in Quick Fix menu (not marked as preferred, so won't trigger on save)
|
|
47
|
+
- Intelligently detects paragraph boundaries and reflows entire paragraph, not just the flagged line
|
|
48
|
+
- Respects line length limit from warning message or defaults to 80 characters
|
|
49
|
+
- Provides a way to try paragraph reflow before committing to enabling it globally
|
|
50
|
+
- Gives users fine-grained control over which paragraphs to reflow
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- **LSP: Preserve trailing newline in reflow action**
|
|
55
|
+
- Manual reflow code action now correctly preserves trailing newlines
|
|
56
|
+
- Prevents unwanted file modifications from reflow operations
|
|
57
|
+
- Maintains document structure integrity
|
|
58
|
+
|
|
59
|
+
- **LSP: Improve logging and resolve auto-fix issues**
|
|
60
|
+
- Enhanced LSP server logging for better debugging
|
|
61
|
+
- Resolved various auto-fix edge cases and reliability issues
|
|
62
|
+
|
|
63
|
+
- **MD051: Correct GitHub slug generation for angle brackets**
|
|
64
|
+
- Fixed incorrect slug generation for headings containing angle brackets
|
|
65
|
+
- Now properly handles special characters in anchor generation
|
|
66
|
+
- Improves accuracy of link validation for complex headings
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **MD033: Remove unhelpful message suffix**
|
|
71
|
+
- Simplified warning messages for inline HTML detection
|
|
72
|
+
- Removed redundant information to reduce noise
|
|
73
|
+
- Cleaner, more focused error messages
|
|
74
|
+
|
|
75
|
+
- **Code cleanup: Remove dead code**
|
|
76
|
+
- Removed unused `LinkImageStyle` enum from MD054
|
|
77
|
+
- General refactoring to improve maintainability
|
|
78
|
+
- Fixed clippy warnings
|
|
79
|
+
|
|
80
|
+
### Documentation
|
|
81
|
+
|
|
82
|
+
- **MD033: Document mdbook use case for semantic HTML**
|
|
83
|
+
- Added documentation about using semantic HTML in mdbook projects
|
|
84
|
+
- Clarifies when and why inline HTML might be intentionally used
|
|
85
|
+
- Helps users understand legitimate use cases for HTML in markdown
|
|
86
|
+
|
|
10
87
|
## [0.0.166] - 2025-10-22
|
|
11
88
|
|
|
12
89
|
### Added
|
|
@@ -95,8 +95,8 @@ test-pre-commit:
|
|
|
95
95
|
cargo nextest run --profile pre-commit
|
|
96
96
|
|
|
97
97
|
test-push:
|
|
98
|
-
@echo "Running
|
|
99
|
-
cargo nextest run --profile
|
|
98
|
+
@echo "Running CI test suite (excludes performance tests)..."
|
|
99
|
+
cargo nextest run --profile ci
|
|
100
100
|
|
|
101
101
|
test-ci:
|
|
102
102
|
cargo nextest run --profile ci
|
|
@@ -62,7 +62,7 @@ MD013:
|
|
|
62
62
|
|
|
63
63
|
### Configuration options explained
|
|
64
64
|
|
|
65
|
-
- `line_length`: The maximum number of characters allowed per line
|
|
65
|
+
- `line_length`: The maximum number of characters allowed per line (set to `0` to disable all line length checks)
|
|
66
66
|
- `code_blocks`: Whether to check line length in code blocks
|
|
67
67
|
- `tables`: Whether to check line length in tables
|
|
68
68
|
- `headings`: Whether to check line length in headings
|
|
@@ -195,6 +195,25 @@ This configuration is useful when:
|
|
|
195
195
|
- You care about line length in code blocks and tables but not in regular text
|
|
196
196
|
- You're using semantic line breaks where sentence length is determined by content, not arbitrary limits
|
|
197
197
|
|
|
198
|
+
#### Disabling all line length checks
|
|
199
|
+
|
|
200
|
+
If you want to completely disable all line length checking (for paragraphs, headings, code blocks, and tables), set `line-length` to `0`:
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
MD013:
|
|
204
|
+
line-length: 0 # Disable all line length checks
|
|
205
|
+
reflow: true
|
|
206
|
+
reflow-mode: "sentence-per-line"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
When `line-length` is set to `0`, no line length warnings will be reported for any content type. This is particularly useful for:
|
|
210
|
+
|
|
211
|
+
- Projects using semantic line breaks where lines break at logical boundaries regardless of length
|
|
212
|
+
- Sentence-per-line workflows where line length is not a concern
|
|
213
|
+
- Documentation where long lines (e.g., URLs, technical terms) are unavoidable and acceptable
|
|
214
|
+
|
|
215
|
+
**Note**: With `line-length: 0`, reflow still works (using a very large effective line length), so you can still use `sentence-per-line` mode for automatic formatting without any line length warnings.
|
|
216
|
+
|
|
198
217
|
### Example with automatic reflow
|
|
199
218
|
|
|
200
219
|
```yaml
|
|
@@ -89,6 +89,24 @@ MD033:
|
|
|
89
89
|
|
|
90
90
|
This would allow line breaks, horizontal rules, and collapsible sections while blocking other HTML.
|
|
91
91
|
|
|
92
|
+
### mdbook projects with semantic HTML
|
|
93
|
+
|
|
94
|
+
mdbook documentation often uses HTML with CSS classes to add semantic meaning that pure Markdown cannot express (e.g., marking text as filenames, captions, or warnings). For mdbook projects, you can
|
|
95
|
+
allow semantic containers:
|
|
96
|
+
|
|
97
|
+
```toml
|
|
98
|
+
[tool.rumdl.MD033]
|
|
99
|
+
allowed-elements = ["div", "span"]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This permits semantic HTML like:
|
|
103
|
+
|
|
104
|
+
- `<span class="filename">src/main.rs</span>` - Filename styling
|
|
105
|
+
- `<div class="warning">Important note</div>` - Warning boxes
|
|
106
|
+
- `<span class="caption">Figure 1: Architecture</span>` - Figure captions
|
|
107
|
+
|
|
108
|
+
While still catching potentially problematic HTML like `<em>`, `<strong>`, or `<script>` tags that have Markdown equivalents or security concerns.
|
|
109
|
+
|
|
92
110
|
## Automatic fixes
|
|
93
111
|
|
|
94
112
|
This rule can automatically remove HTML tags when no allowed elements are configured. When specific tags are allowed via `allowed_elements`, those tags will be preserved while others are removed.
|
|
@@ -64,6 +64,65 @@ MD053:
|
|
|
64
64
|
|
|
65
65
|
This keeps reference definitions with names like "todo", "draft", or "template" even if they're not currently used.
|
|
66
66
|
|
|
67
|
+
## Comment-Style References
|
|
68
|
+
|
|
69
|
+
rumdl automatically recognizes and ignores common community patterns for adding comments using reference-style syntax. These patterns are **not part of any official Markdown specification**
|
|
70
|
+
(CommonMark, GFM), but are widely used across 23+ Markdown implementations.
|
|
71
|
+
|
|
72
|
+
### Recognized Comment Patterns
|
|
73
|
+
|
|
74
|
+
The following patterns are automatically ignored and won't be flagged as unused:
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
[//]: # (This is a comment - most popular pattern)
|
|
78
|
+
[comment]: # (This is a semantic comment)
|
|
79
|
+
[note]: # (This is a note for documentation)
|
|
80
|
+
[todo]: # (Add more examples here)
|
|
81
|
+
[fixme]: # (This needs to be fixed)
|
|
82
|
+
[hack]: # (Temporary workaround)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Any reference definition with just `#` as the URL is also treated as a comment:
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
[anything]: # (This will be treated as a comment)
|
|
89
|
+
[ref]: # "Also a comment"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Why These Work
|
|
93
|
+
|
|
94
|
+
These patterns exploit valid Markdown link reference syntax:
|
|
95
|
+
|
|
96
|
+
- The label (e.g., `[//]`) is technically valid
|
|
97
|
+
- The `#` is a valid URL (just a fragment/anchor)
|
|
98
|
+
- Since the reference is never used, it doesn't render
|
|
99
|
+
|
|
100
|
+
### When to Use
|
|
101
|
+
|
|
102
|
+
**Use HTML comments for standard commenting:**
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
<!-- This is the recommended way to add comments -->
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Use reference-style comments when:**
|
|
109
|
+
|
|
110
|
+
- Your documentation tool strips HTML comments
|
|
111
|
+
- You prefer a less HTML-like syntax
|
|
112
|
+
- You're following project conventions that use this pattern
|
|
113
|
+
- You need comments that won't appear in page source
|
|
114
|
+
|
|
115
|
+
### Real vs. Comment References
|
|
116
|
+
|
|
117
|
+
rumdl distinguishes between comment patterns and real references:
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
[//]: # (This is ignored - it's a comment)
|
|
121
|
+
[real-link]: https://example.com <!-- This WILL be flagged if unused -->
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Only the real reference definition will trigger MD053 if it's not used in the document.
|
|
125
|
+
|
|
67
126
|
## Automatic fixes
|
|
68
127
|
|
|
69
128
|
This rule can automatically fix issues by:
|
|
@@ -88,7 +88,7 @@ pub fn normalize_key(key: &str) -> String {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/// Represents a rule-specific configuration
|
|
91
|
-
#[derive(Debug, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
|
|
91
|
+
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
|
|
92
92
|
pub struct RuleConfig {
|
|
93
93
|
/// Configuration values for the rule
|
|
94
94
|
#[serde(flatten)]
|
|
@@ -110,7 +110,7 @@ fn arbitrary_value_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schema
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/// Represents the complete configuration loaded from rumdl.toml
|
|
113
|
-
#[derive(Debug, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
|
|
113
|
+
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
|
|
114
114
|
#[schemars(
|
|
115
115
|
description = "rumdl configuration for linting Markdown files. Rules can be configured individually using [MD###] sections with rule-specific options."
|
|
116
116
|
)]
|
|
@@ -205,7 +205,7 @@ impl Config {
|
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
/// Global configuration options
|
|
208
|
-
#[derive(Debug, Serialize, Deserialize, PartialEq, schemars::JsonSchema)]
|
|
208
|
+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, schemars::JsonSchema)]
|
|
209
209
|
#[serde(default)]
|
|
210
210
|
pub struct GlobalConfig {
|
|
211
211
|
/// Enabled rules
|
|
@@ -340,7 +340,7 @@ exclude = [
|
|
|
340
340
|
]
|
|
341
341
|
|
|
342
342
|
# Respect .gitignore files when scanning directories (default: true)
|
|
343
|
-
|
|
343
|
+
respect-gitignore = true
|
|
344
344
|
|
|
345
345
|
# Markdown flavor/dialect (uncomment to enable)
|
|
346
346
|
# Options: mkdocs, gfm, commonmark
|
|
@@ -358,8 +358,8 @@ respect_gitignore = true
|
|
|
358
358
|
# indent = 4 # Unordered list indentation
|
|
359
359
|
|
|
360
360
|
# [MD013]
|
|
361
|
-
#
|
|
362
|
-
#
|
|
361
|
+
# line-length = 100 # Line length
|
|
362
|
+
# code-blocks = false # Exclude code blocks from line length check
|
|
363
363
|
# tables = false # Exclude tables from line length check
|
|
364
364
|
# headings = true # Include headings in line length check
|
|
365
365
|
|
|
@@ -452,8 +452,8 @@ respect-gitignore = true
|
|
|
452
452
|
# indent = 4 # Unordered list indentation
|
|
453
453
|
|
|
454
454
|
# [tool.rumdl.MD013]
|
|
455
|
-
#
|
|
456
|
-
#
|
|
455
|
+
# line-length = 100 # Line length
|
|
456
|
+
# code-blocks = false # Exclude code blocks from line length check
|
|
457
457
|
# tables = false # Exclude tables from line length check
|
|
458
458
|
# headings = true # Include headings in line length check
|
|
459
459
|
|
|
@@ -1468,7 +1468,8 @@ pub struct SourcedConfigFragment {
|
|
|
1468
1468
|
pub global: SourcedGlobalConfig,
|
|
1469
1469
|
pub per_file_ignores: SourcedValue<HashMap<String, Vec<String>>>,
|
|
1470
1470
|
pub rules: BTreeMap<String, SourcedRuleConfig>,
|
|
1471
|
-
|
|
1471
|
+
pub unknown_keys: Vec<(String, String, Option<String>)>, // (section, key, file_path)
|
|
1472
|
+
// Note: loaded_files is tracked globally in SourcedConfig.
|
|
1472
1473
|
}
|
|
1473
1474
|
|
|
1474
1475
|
impl Default for SourcedConfigFragment {
|
|
@@ -1477,6 +1478,7 @@ impl Default for SourcedConfigFragment {
|
|
|
1477
1478
|
global: SourcedGlobalConfig::default(),
|
|
1478
1479
|
per_file_ignores: SourcedValue::new(HashMap::new(), ConfigSource::Default),
|
|
1479
1480
|
rules: BTreeMap::new(),
|
|
1481
|
+
unknown_keys: Vec::new(),
|
|
1480
1482
|
}
|
|
1481
1483
|
}
|
|
1482
1484
|
}
|
|
@@ -1487,7 +1489,7 @@ pub struct SourcedConfig {
|
|
|
1487
1489
|
pub per_file_ignores: SourcedValue<HashMap<String, Vec<String>>>,
|
|
1488
1490
|
pub rules: BTreeMap<String, SourcedRuleConfig>,
|
|
1489
1491
|
pub loaded_files: Vec<String>,
|
|
1490
|
-
pub unknown_keys: Vec<(String, String)>, // (section, key)
|
|
1492
|
+
pub unknown_keys: Vec<(String, String, Option<String>)>, // (section, key, file_path)
|
|
1491
1493
|
}
|
|
1492
1494
|
|
|
1493
1495
|
impl Default for SourcedConfig {
|
|
@@ -1628,6 +1630,14 @@ impl SourcedConfig {
|
|
|
1628
1630
|
);
|
|
1629
1631
|
}
|
|
1630
1632
|
}
|
|
1633
|
+
|
|
1634
|
+
// Merge unknown_keys from fragment
|
|
1635
|
+
for (section, key, file_path) in fragment.unknown_keys {
|
|
1636
|
+
// Deduplicate: only add if not already present
|
|
1637
|
+
if !self.unknown_keys.iter().any(|(s, k, _)| s == §ion && k == &key) {
|
|
1638
|
+
self.unknown_keys.push((section, key, file_path));
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1631
1641
|
}
|
|
1632
1642
|
|
|
1633
1643
|
/// Load and merge configurations from files and CLI overrides.
|
|
@@ -1956,7 +1966,7 @@ impl SourcedConfig {
|
|
|
1956
1966
|
// No rule-specific CLI overrides implemented yet
|
|
1957
1967
|
}
|
|
1958
1968
|
|
|
1959
|
-
//
|
|
1969
|
+
// Unknown keys are now collected during parsing and validated via validate_config_sourced()
|
|
1960
1970
|
|
|
1961
1971
|
Ok(sourced_config)
|
|
1962
1972
|
}
|
|
@@ -2145,8 +2155,14 @@ pub fn validate_config_sourced(sourced: &SourcedConfig, registry: &RuleRegistry)
|
|
|
2145
2155
|
if let Some(valid_keys) = registry.config_keys_for(rule) {
|
|
2146
2156
|
for key in rule_cfg.values.keys() {
|
|
2147
2157
|
if !valid_keys.contains(key) {
|
|
2158
|
+
let valid_keys_vec: Vec<String> = valid_keys.iter().cloned().collect();
|
|
2159
|
+
let message = if let Some(suggestion) = suggest_similar_key(key, &valid_keys_vec) {
|
|
2160
|
+
format!("Unknown option for rule {rule}: {key} (did you mean: {suggestion}?)")
|
|
2161
|
+
} else {
|
|
2162
|
+
format!("Unknown option for rule {rule}: {key}")
|
|
2163
|
+
};
|
|
2148
2164
|
warnings.push(ConfigValidationWarning {
|
|
2149
|
-
message
|
|
2165
|
+
message,
|
|
2150
2166
|
rule: Some(rule.clone()),
|
|
2151
2167
|
key: Some(key.clone()),
|
|
2152
2168
|
});
|
|
@@ -2173,13 +2189,60 @@ pub fn validate_config_sourced(sourced: &SourcedConfig, registry: &RuleRegistry)
|
|
|
2173
2189
|
}
|
|
2174
2190
|
}
|
|
2175
2191
|
// 3. Unknown global options (from unknown_keys)
|
|
2176
|
-
|
|
2177
|
-
|
|
2192
|
+
let known_global_keys = vec![
|
|
2193
|
+
"enable".to_string(),
|
|
2194
|
+
"disable".to_string(),
|
|
2195
|
+
"include".to_string(),
|
|
2196
|
+
"exclude".to_string(),
|
|
2197
|
+
"respect-gitignore".to_string(),
|
|
2198
|
+
"line-length".to_string(),
|
|
2199
|
+
"fixable".to_string(),
|
|
2200
|
+
"unfixable".to_string(),
|
|
2201
|
+
"flavor".to_string(),
|
|
2202
|
+
"force-exclude".to_string(),
|
|
2203
|
+
"output-format".to_string(),
|
|
2204
|
+
];
|
|
2205
|
+
|
|
2206
|
+
for (section, key, file_path) in &sourced.unknown_keys {
|
|
2207
|
+
if section.contains("[global]") || section.contains("[tool.rumdl]") {
|
|
2208
|
+
let message = if let Some(suggestion) = suggest_similar_key(key, &known_global_keys) {
|
|
2209
|
+
if let Some(path) = file_path {
|
|
2210
|
+
format!("Unknown global option in {path}: {key} (did you mean: {suggestion}?)")
|
|
2211
|
+
} else {
|
|
2212
|
+
format!("Unknown global option: {key} (did you mean: {suggestion}?)")
|
|
2213
|
+
}
|
|
2214
|
+
} else if let Some(path) = file_path {
|
|
2215
|
+
format!("Unknown global option in {path}: {key}")
|
|
2216
|
+
} else {
|
|
2217
|
+
format!("Unknown global option: {key}")
|
|
2218
|
+
};
|
|
2178
2219
|
warnings.push(ConfigValidationWarning {
|
|
2179
|
-
message
|
|
2220
|
+
message,
|
|
2180
2221
|
rule: None,
|
|
2181
2222
|
key: Some(key.clone()),
|
|
2182
2223
|
});
|
|
2224
|
+
} else if !key.is_empty() {
|
|
2225
|
+
// This is an unknown rule section (key is empty means it's a section header)
|
|
2226
|
+
// No suggestions for rule names - just warn
|
|
2227
|
+
continue;
|
|
2228
|
+
} else {
|
|
2229
|
+
// Unknown rule section
|
|
2230
|
+
let message = if let Some(path) = file_path {
|
|
2231
|
+
format!(
|
|
2232
|
+
"Unknown rule in {path}: {}",
|
|
2233
|
+
section.trim_matches(|c| c == '[' || c == ']')
|
|
2234
|
+
)
|
|
2235
|
+
} else {
|
|
2236
|
+
format!(
|
|
2237
|
+
"Unknown rule in config: {}",
|
|
2238
|
+
section.trim_matches(|c| c == '[' || c == ']')
|
|
2239
|
+
)
|
|
2240
|
+
};
|
|
2241
|
+
warnings.push(ConfigValidationWarning {
|
|
2242
|
+
message,
|
|
2243
|
+
rule: None,
|
|
2244
|
+
key: None,
|
|
2245
|
+
});
|
|
2183
2246
|
}
|
|
2184
2247
|
}
|
|
2185
2248
|
warnings
|
|
@@ -2197,6 +2260,63 @@ fn toml_type_name(val: &toml::Value) -> &'static str {
|
|
|
2197
2260
|
}
|
|
2198
2261
|
}
|
|
2199
2262
|
|
|
2263
|
+
/// Calculate Levenshtein distance between two strings (simple implementation)
|
|
2264
|
+
fn levenshtein_distance(s1: &str, s2: &str) -> usize {
|
|
2265
|
+
let len1 = s1.len();
|
|
2266
|
+
let len2 = s2.len();
|
|
2267
|
+
|
|
2268
|
+
if len1 == 0 {
|
|
2269
|
+
return len2;
|
|
2270
|
+
}
|
|
2271
|
+
if len2 == 0 {
|
|
2272
|
+
return len1;
|
|
2273
|
+
}
|
|
2274
|
+
|
|
2275
|
+
let s1_chars: Vec<char> = s1.chars().collect();
|
|
2276
|
+
let s2_chars: Vec<char> = s2.chars().collect();
|
|
2277
|
+
|
|
2278
|
+
let mut prev_row: Vec<usize> = (0..=len2).collect();
|
|
2279
|
+
let mut curr_row = vec![0; len2 + 1];
|
|
2280
|
+
|
|
2281
|
+
for i in 1..=len1 {
|
|
2282
|
+
curr_row[0] = i;
|
|
2283
|
+
for j in 1..=len2 {
|
|
2284
|
+
let cost = if s1_chars[i - 1] == s2_chars[j - 1] { 0 } else { 1 };
|
|
2285
|
+
curr_row[j] = (prev_row[j] + 1) // deletion
|
|
2286
|
+
.min(curr_row[j - 1] + 1) // insertion
|
|
2287
|
+
.min(prev_row[j - 1] + cost); // substitution
|
|
2288
|
+
}
|
|
2289
|
+
std::mem::swap(&mut prev_row, &mut curr_row);
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
prev_row[len2]
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
/// Suggest a similar key from a list of valid keys using fuzzy matching
|
|
2296
|
+
fn suggest_similar_key(unknown: &str, valid_keys: &[String]) -> Option<String> {
|
|
2297
|
+
let unknown_lower = unknown.to_lowercase();
|
|
2298
|
+
let max_distance = 2.max(unknown.len() / 3); // Allow up to 2 edits or 30% of string length
|
|
2299
|
+
|
|
2300
|
+
let mut best_match: Option<(String, usize)> = None;
|
|
2301
|
+
|
|
2302
|
+
for valid in valid_keys {
|
|
2303
|
+
let valid_lower = valid.to_lowercase();
|
|
2304
|
+
let distance = levenshtein_distance(&unknown_lower, &valid_lower);
|
|
2305
|
+
|
|
2306
|
+
if distance <= max_distance {
|
|
2307
|
+
if let Some((_, best_dist)) = &best_match {
|
|
2308
|
+
if distance < *best_dist {
|
|
2309
|
+
best_match = Some((valid.clone(), distance));
|
|
2310
|
+
}
|
|
2311
|
+
} else {
|
|
2312
|
+
best_match = Some((valid.clone(), distance));
|
|
2313
|
+
}
|
|
2314
|
+
}
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2317
|
+
best_match.map(|(key, _)| key)
|
|
2318
|
+
}
|
|
2319
|
+
|
|
2200
2320
|
fn toml_value_type_matches(expected: &toml::Value, actual: &toml::Value) -> bool {
|
|
2201
2321
|
use toml::Value::*;
|
|
2202
2322
|
match (expected, actual) {
|
|
@@ -2438,8 +2558,10 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
2438
2558
|
}
|
|
2439
2559
|
} else {
|
|
2440
2560
|
// Key is not a global/special key, doesn't start with 'md', or isn't a table.
|
|
2441
|
-
//
|
|
2442
|
-
|
|
2561
|
+
// Track unknown keys under [tool.rumdl] for validation
|
|
2562
|
+
fragment
|
|
2563
|
+
.unknown_keys
|
|
2564
|
+
.push(("[tool.rumdl]".to_string(), key.to_string(), Some(path.to_string())));
|
|
2443
2565
|
}
|
|
2444
2566
|
}
|
|
2445
2567
|
}
|
|
@@ -2464,6 +2586,13 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
2464
2586
|
.or_insert_with(|| SourcedValue::new(toml_val.clone(), source));
|
|
2465
2587
|
sv.push_override(toml_val, source, file.clone(), None);
|
|
2466
2588
|
}
|
|
2589
|
+
} else if rule_name.to_ascii_uppercase().starts_with("MD") {
|
|
2590
|
+
// Track unknown rule sections like [tool.rumdl.MD999]
|
|
2591
|
+
fragment.unknown_keys.push((
|
|
2592
|
+
format!("[tool.rumdl.{rule_name}]"),
|
|
2593
|
+
String::new(),
|
|
2594
|
+
Some(path.to_string()),
|
|
2595
|
+
));
|
|
2467
2596
|
}
|
|
2468
2597
|
}
|
|
2469
2598
|
}
|
|
@@ -2489,6 +2618,13 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
|
|
|
2489
2618
|
.or_insert_with(|| SourcedValue::new(toml_val.clone(), source));
|
|
2490
2619
|
sv.push_override(toml_val, source, file.clone(), None);
|
|
2491
2620
|
}
|
|
2621
|
+
} else if rule_name.to_ascii_uppercase().starts_with("MD") {
|
|
2622
|
+
// Track unknown rule sections like [tool.rumdl.MD999]
|
|
2623
|
+
fragment.unknown_keys.push((
|
|
2624
|
+
format!("[tool.rumdl.{rule_name}]"),
|
|
2625
|
+
String::new(),
|
|
2626
|
+
Some(path.to_string()),
|
|
2627
|
+
));
|
|
2492
2628
|
}
|
|
2493
2629
|
}
|
|
2494
2630
|
}
|
|
@@ -2715,8 +2851,10 @@ fn parse_rumdl_toml(content: &str, path: &str) -> Result<SourcedConfigFragment,
|
|
|
2715
2851
|
}
|
|
2716
2852
|
}
|
|
2717
2853
|
_ => {
|
|
2718
|
-
//
|
|
2719
|
-
|
|
2854
|
+
// Track unknown global keys for validation
|
|
2855
|
+
fragment
|
|
2856
|
+
.unknown_keys
|
|
2857
|
+
.push(("[global]".to_string(), key.to_string(), Some(path.to_string())));
|
|
2720
2858
|
log::warn!("[WARN] Unknown key in [global] section of {path}: {key}");
|
|
2721
2859
|
}
|
|
2722
2860
|
}
|
|
@@ -2751,9 +2889,23 @@ fn parse_rumdl_toml(content: &str, path: &str) -> Result<SourcedConfigFragment,
|
|
|
2751
2889
|
// Rule-specific: all other top-level tables
|
|
2752
2890
|
for (key, item) in doc.iter() {
|
|
2753
2891
|
let norm_rule_name = key.to_ascii_uppercase();
|
|
2892
|
+
|
|
2893
|
+
// Skip known special sections
|
|
2894
|
+
if key == "global" || key == "per-file-ignores" {
|
|
2895
|
+
continue;
|
|
2896
|
+
}
|
|
2897
|
+
|
|
2898
|
+
// Track unknown rule sections (like [MD999])
|
|
2754
2899
|
if !known_rule_names.contains(&norm_rule_name) {
|
|
2900
|
+
// Only track if it looks like a rule section (starts with MD or is uppercase)
|
|
2901
|
+
if norm_rule_name.starts_with("MD") || key.chars().all(|c| c.is_uppercase() || c.is_numeric()) {
|
|
2902
|
+
fragment
|
|
2903
|
+
.unknown_keys
|
|
2904
|
+
.push((format!("[{key}]"), String::new(), Some(path.to_string())));
|
|
2905
|
+
}
|
|
2755
2906
|
continue;
|
|
2756
2907
|
}
|
|
2908
|
+
|
|
2757
2909
|
if let Some(tbl) = item.as_table() {
|
|
2758
2910
|
let rule_entry = fragment.rules.entry(norm_rule_name.clone()).or_default();
|
|
2759
2911
|
for (rk, rv_item) in tbl.iter() {
|
|
@@ -10,7 +10,7 @@ pub mod server;
|
|
|
10
10
|
pub mod types;
|
|
11
11
|
|
|
12
12
|
pub use server::RumdlLanguageServer;
|
|
13
|
-
pub use types::{RumdlLspConfig,
|
|
13
|
+
pub use types::{RumdlLspConfig, warning_to_code_actions, warning_to_diagnostic};
|
|
14
14
|
|
|
15
15
|
use anyhow::Result;
|
|
16
16
|
use tokio::net::TcpListener;
|
|
@@ -64,7 +64,7 @@ mod tests {
|
|
|
64
64
|
&crate::rule::LintWarning,
|
|
65
65
|
&tower_lsp::lsp_types::Url,
|
|
66
66
|
&str,
|
|
67
|
-
) ->
|
|
67
|
+
) -> Vec<tower_lsp::lsp_types::CodeAction> = warning_to_code_actions;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|