rumdl 0.0.104__tar.gz → 0.0.106__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.104 → rumdl-0.0.106}/.pre-commit-config.yaml +1 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/CHANGELOG.md +33 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/Cargo.lock +7 -7
- {rumdl-0.0.104 → rumdl-0.0.106}/Cargo.toml +28 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/PKG-INFO +1 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md013.md +21 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md033.md +17 -2
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md044.md +2 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/lint_context.rs +93 -11
- {rumdl-0.0.104 → rumdl-0.0.106}/src/main.rs +6 -3
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md027_multiple_spaces_blockquote.rs +106 -30
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/range_utils.rs +51 -1
- rumdl-0.0.106/src/vscode.rs +613 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/list_rules_integration_test.rs +6 -2
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md029_test.rs +256 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md044_test.rs +24 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/vscode_test.rs +1 -1
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/vscode_tests.rs +8 -3
- rumdl-0.0.104/src/vscode.rs +0 -349
- {rumdl-0.0.104 → rumdl-0.0.106}/.config/nextest.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/.mise.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/.rumdl.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/.rustfmt.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/LICENSE +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/MANIFEST.in +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/Makefile +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/README.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/assets/logo.png +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/benches/range_performance.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.104/src → rumdl-0.0.106/benchmark}/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.104/src → rumdl-0.0.106/benchmark}/bin/benchmark.rs +0 -0
- {rumdl-0.0.104/src → rumdl-0.0.106/benchmark}/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.104/src → rumdl-0.0.106/benchmark}/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.104/src → rumdl-0.0.106/benchmark}/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/RULES.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/global-settings.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md001.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md002.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md003.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md004.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md005.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md006.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md007.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md009.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md010.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md011.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md012.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md014.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md018.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md019.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md020.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md021.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md022.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md023.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md024.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md025.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md026.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md027.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md028.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md029.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md030.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md031.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md032.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md034.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md035.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md036.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md037.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md038.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md039.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md040.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md041.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md042.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md043.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md045.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md046.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md047.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md048.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md049.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md050.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md051.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md052.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md053.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md054.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md055.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md056.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md057.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/md058.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/parity_check.py +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/pyproject.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/python/MANIFEST.in +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/rumdl.toml.example +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/rust-toolchain.toml +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/exit_codes.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/init.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/inline_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/lib.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/lsp/server.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/lsp/types.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/output/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/parallel.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/performance.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/profiling.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/python.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rule.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rule_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/config_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/init_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/lib.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/perf_check.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.104 → rumdl-0.0.106}/tests/vscode_extension_fixes.rs +0 -0
|
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.106] - 2025-08-05
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Moved benchmark binaries from Python package distribution
|
|
14
|
+
- Benchmark tools are now in `benchmark/bin/` directory
|
|
15
|
+
- Added `build-benchmarks` feature flag to explicitly build benchmarks
|
|
16
|
+
- Python package now only includes the main `rumdl` binary
|
|
17
|
+
- Significantly reduced installed package size
|
|
18
|
+
|
|
19
|
+
## [0.0.105] - 2025-08-05
|
|
20
|
+
|
|
21
|
+
## [0.0.105] - 2025-08-05
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- MD029: Fixed list continuation detection to properly handle variable marker widths (fixes #16)
|
|
25
|
+
- List items with double-digit markers (e.g., "10. ") now correctly require 4+ spaces for continuation
|
|
26
|
+
- List items with triple-digit markers (e.g., "100. ") now correctly require 5+ spaces for continuation
|
|
27
|
+
- List items with any number of digits now correctly calculate required continuation indentation
|
|
28
|
+
- MD027: Improved tab handling and added bounds checking for range calculations
|
|
29
|
+
- Installation: Improved update experience for Cursor/Windsurf editors
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
- `--update` flag to check for newer versions and update if available
|
|
33
|
+
- Version checking with update notifications
|
|
34
|
+
- Marketplace-aware installation for VS Code forks
|
|
35
|
+
- Comprehensive tests for MD029 with large number markers (triple and quadruple digits)
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
- Clarified `--force` flag behavior in help text
|
|
39
|
+
|
|
10
40
|
## [0.0.104] - 2025-08-02
|
|
11
41
|
|
|
12
42
|
### Added
|
|
@@ -259,7 +289,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
259
289
|
|
|
260
290
|
- Initial implementation of remaining rules for markdownlint parity
|
|
261
291
|
|
|
262
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
292
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.105...HEAD
|
|
293
|
+
[0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
|
|
294
|
+
[0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
|
|
263
295
|
[0.0.104]: https://github.com/rvben/rumdl/compare/v0.0.103...v0.0.104
|
|
264
296
|
[0.0.102]: https://github.com/rvben/rumdl/compare/v0.0.101...v0.0.102
|
|
265
297
|
[0.0.101]: https://github.com/rvben/rumdl/compare/v0.0.100...v0.0.101
|
|
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|
|
1493
1493
|
|
|
1494
1494
|
[[package]]
|
|
1495
1495
|
name = "rumdl"
|
|
1496
|
-
version = "0.0.
|
|
1496
|
+
version = "0.0.106"
|
|
1497
1497
|
dependencies = [
|
|
1498
1498
|
"anyhow",
|
|
1499
1499
|
"assert_cmd",
|
|
@@ -1680,9 +1680,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|
|
1680
1680
|
|
|
1681
1681
|
[[package]]
|
|
1682
1682
|
name = "signal-hook-registry"
|
|
1683
|
-
version = "1.4.
|
|
1683
|
+
version = "1.4.6"
|
|
1684
1684
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1685
|
-
checksum = "
|
|
1685
|
+
checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
|
|
1686
1686
|
dependencies = [
|
|
1687
1687
|
"libc",
|
|
1688
1688
|
]
|
|
@@ -1856,9 +1856,9 @@ dependencies = [
|
|
|
1856
1856
|
|
|
1857
1857
|
[[package]]
|
|
1858
1858
|
name = "tokio-util"
|
|
1859
|
-
version = "0.7.
|
|
1859
|
+
version = "0.7.16"
|
|
1860
1860
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1861
|
-
checksum = "
|
|
1861
|
+
checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
|
|
1862
1862
|
dependencies = [
|
|
1863
1863
|
"bytes",
|
|
1864
1864
|
"futures-core",
|
|
@@ -2527,9 +2527,9 @@ dependencies = [
|
|
|
2527
2527
|
|
|
2528
2528
|
[[package]]
|
|
2529
2529
|
name = "zerovec"
|
|
2530
|
-
version = "0.11.
|
|
2530
|
+
version = "0.11.3"
|
|
2531
2531
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2532
|
-
checksum = "
|
|
2532
|
+
checksum = "bdbb9122ea75b11bf96e7492afb723e8a7fbe12c67417aa95e7e3d18144d37cd"
|
|
2533
2533
|
dependencies = [
|
|
2534
2534
|
"yoke",
|
|
2535
2535
|
"zerofrom",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.106"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
rust-version = "1.88.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
@@ -22,6 +22,32 @@ crate-type = ["cdylib", "rlib"]
|
|
|
22
22
|
name = "rumdl"
|
|
23
23
|
path = "src/main.rs"
|
|
24
24
|
|
|
25
|
+
# Benchmark binaries - only built when explicitly requested
|
|
26
|
+
[[bin]]
|
|
27
|
+
name = "benchmark"
|
|
28
|
+
path = "benchmark/bin/benchmark.rs"
|
|
29
|
+
required-features = ["build-benchmarks"]
|
|
30
|
+
|
|
31
|
+
[[bin]]
|
|
32
|
+
name = "bench_lint_context"
|
|
33
|
+
path = "benchmark/bin/bench_lint_context.rs"
|
|
34
|
+
required-features = ["build-benchmarks"]
|
|
35
|
+
|
|
36
|
+
[[bin]]
|
|
37
|
+
name = "benchmark_rule"
|
|
38
|
+
path = "benchmark/bin/benchmark_rule.rs"
|
|
39
|
+
required-features = ["build-benchmarks"]
|
|
40
|
+
|
|
41
|
+
[[bin]]
|
|
42
|
+
name = "file_parallel_benchmark"
|
|
43
|
+
path = "benchmark/bin/file_parallel_benchmark.rs"
|
|
44
|
+
required-features = ["build-benchmarks"]
|
|
45
|
+
|
|
46
|
+
[[bin]]
|
|
47
|
+
name = "measure_code_span_performance"
|
|
48
|
+
path = "benchmark/bin/measure_code_span_performance.rs"
|
|
49
|
+
required-features = ["build-benchmarks"]
|
|
50
|
+
|
|
25
51
|
[[bench]]
|
|
26
52
|
name = "rule_performance"
|
|
27
53
|
harness = false
|
|
@@ -93,6 +119,7 @@ parallel = ["rayon"]
|
|
|
93
119
|
profiling = []
|
|
94
120
|
python = ["pyo3"]
|
|
95
121
|
structure_preprocessing = []
|
|
122
|
+
build-benchmarks = []
|
|
96
123
|
|
|
97
124
|
[dev-dependencies]
|
|
98
125
|
assert_cmd = "2.0.17"
|
|
@@ -55,6 +55,7 @@ MD013:
|
|
|
55
55
|
code_block_line_length: 150 # Different limit for code blocks (default: uses line_length)
|
|
56
56
|
stern: false # Stricter checking without exceptions (default: false)
|
|
57
57
|
strict: false # Disables exceptions for URLs, etc. (default: false)
|
|
58
|
+
enable_reflow: false # Enable automatic text reflow/wrapping (default: false)
|
|
58
59
|
```
|
|
59
60
|
|
|
60
61
|
### Configuration options explained
|
|
@@ -67,6 +68,7 @@ MD013:
|
|
|
67
68
|
- `code_block_line_length`: Optional separate limit for code blocks
|
|
68
69
|
- `stern`: When true, applies stricter checking without common exceptions
|
|
69
70
|
- `strict`: When true, disables exceptions for URLs and other special content
|
|
71
|
+
- `enable_reflow`: When true, enables automatic text reflow to wrap long lines intelligently
|
|
70
72
|
|
|
71
73
|
### Example with different limits
|
|
72
74
|
|
|
@@ -98,7 +100,25 @@ def very_long_function_name_that_demonstrates_the_code_block_line_length_configu
|
|
|
98
100
|
|
|
99
101
|
## Automatic fixes
|
|
100
102
|
|
|
101
|
-
|
|
103
|
+
When `enable_reflow` is set to `true`, this rule can automatically wrap long lines while preserving Markdown formatting:
|
|
104
|
+
|
|
105
|
+
- Intelligently breaks lines at appropriate points
|
|
106
|
+
- Preserves bold, italic, links, code spans, and other Markdown elements
|
|
107
|
+
- Maintains proper list continuation indentation
|
|
108
|
+
- Preserves hard line breaks (two trailing spaces)
|
|
109
|
+
- Does not wrap code blocks, tables, headings, or reference definitions
|
|
110
|
+
|
|
111
|
+
### Example with automatic reflow
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
MD013:
|
|
115
|
+
line_length: 80
|
|
116
|
+
enable_reflow: true
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
With this configuration, long lines will be automatically wrapped to fit within 80 characters while maintaining proper Markdown formatting.
|
|
120
|
+
|
|
121
|
+
**Note**: When `enable_reflow` is `false` (default), automatic fixes are not available and you'll need to manually wrap long lines.
|
|
102
122
|
|
|
103
123
|
## Learn more
|
|
104
124
|
|
|
@@ -58,7 +58,20 @@ This is a paragraph with <strong>bold</strong> and <em>italic</em> text.
|
|
|
58
58
|
|
|
59
59
|
### 🔧 Fixed
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
```markdown
|
|
62
|
+
# Heading
|
|
63
|
+
|
|
64
|
+
This is a paragraph with **bold** and *italic* text.
|
|
65
|
+
|
|
66
|
+
> This is a quote
|
|
67
|
+
|
|
68
|
+
- List item 1
|
|
69
|
+
- List item 2
|
|
70
|
+
|
|
71
|
+
[Link text](https://example.com)
|
|
72
|
+
|
|
73
|
+

|
|
74
|
+
```
|
|
62
75
|
|
|
63
76
|
## Configuration
|
|
64
77
|
|
|
@@ -78,7 +91,9 @@ This would allow line breaks, horizontal rules, and collapsible sections while b
|
|
|
78
91
|
|
|
79
92
|
## Automatic fixes
|
|
80
93
|
|
|
81
|
-
This rule
|
|
94
|
+
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.
|
|
95
|
+
|
|
96
|
+
**Note**: The automatic fix removes HTML tags but does not convert them to Markdown equivalents. You may need to manually add appropriate Markdown formatting after the fix.
|
|
82
97
|
|
|
83
98
|
## What's allowed
|
|
84
99
|
|
|
@@ -62,6 +62,7 @@ MD044:
|
|
|
62
62
|
- "npm" # Yes, npm is lowercase!
|
|
63
63
|
code_blocks: false # Check inside code blocks (default: true)
|
|
64
64
|
html_elements: true # Check inside HTML elements (default: true)
|
|
65
|
+
html_comments: true # Check inside HTML comments (default: true)
|
|
65
66
|
```
|
|
66
67
|
|
|
67
68
|
## Automatic fixes
|
|
@@ -76,6 +77,7 @@ When enabled, this rule will:
|
|
|
76
77
|
- Only checks names you've configured
|
|
77
78
|
- Won't check inside URLs or file paths
|
|
78
79
|
- Respects `code_blocks` setting for technical documentation
|
|
80
|
+
- Respects `html_comments` setting for HTML comment content
|
|
79
81
|
- Some names are intentionally lowercase (like "npm")
|
|
80
82
|
|
|
81
83
|
## Learn more
|
|
@@ -241,6 +241,8 @@ pub struct ListBlock {
|
|
|
241
241
|
pub item_lines: Vec<usize>,
|
|
242
242
|
/// Nesting level (0 for top-level lists)
|
|
243
243
|
pub nesting_level: usize,
|
|
244
|
+
/// Maximum marker width seen in this block (e.g., 3 for "1. ", 4 for "10. ")
|
|
245
|
+
pub max_marker_width: usize,
|
|
244
246
|
}
|
|
245
247
|
|
|
246
248
|
use std::sync::{Arc, Mutex};
|
|
@@ -1072,7 +1074,8 @@ impl<'a> LintContext<'a> {
|
|
|
1072
1074
|
|
|
1073
1075
|
// Check for various blockquote issues
|
|
1074
1076
|
let has_no_space = spaces_after.is_empty() && !content.is_empty();
|
|
1075
|
-
|
|
1077
|
+
// Consider tabs as multiple spaces, or actual multiple spaces
|
|
1078
|
+
let has_multiple_spaces = spaces_after.len() > 1 || spaces_after.contains('\t');
|
|
1076
1079
|
|
|
1077
1080
|
// Check if needs MD028 fix (empty blockquote without proper spacing)
|
|
1078
1081
|
let needs_md028_fix = content.trim().is_empty() && spaces_after.is_empty();
|
|
@@ -1293,6 +1296,7 @@ impl<'a> LintContext<'a> {
|
|
|
1293
1296
|
let mut current_block: Option<ListBlock> = None;
|
|
1294
1297
|
let mut last_list_item_line = 0;
|
|
1295
1298
|
let mut current_indent_level = 0;
|
|
1299
|
+
let mut last_marker_width = 0;
|
|
1296
1300
|
|
|
1297
1301
|
for (line_idx, line_info) in lines.iter().enumerate() {
|
|
1298
1302
|
let line_num = line_idx + 1;
|
|
@@ -1302,7 +1306,16 @@ impl<'a> LintContext<'a> {
|
|
|
1302
1306
|
if let Some(ref mut block) = current_block {
|
|
1303
1307
|
// For code blocks to continue a list, they need to be indented
|
|
1304
1308
|
// at least 2 spaces beyond the list marker
|
|
1305
|
-
|
|
1309
|
+
// Calculate minimum indentation for list continuation
|
|
1310
|
+
// For ordered lists, use the last marker width (e.g., 3 for "1. ", 4 for "10. ")
|
|
1311
|
+
// For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
|
|
1312
|
+
let min_continuation_indent = if block.is_ordered {
|
|
1313
|
+
current_indent_level + last_marker_width
|
|
1314
|
+
} else {
|
|
1315
|
+
current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
|
|
1316
|
+
};
|
|
1317
|
+
|
|
1318
|
+
if line_info.indent >= min_continuation_indent {
|
|
1306
1319
|
// Code blocks at list continuation level should continue the list
|
|
1307
1320
|
block.end_line = line_num;
|
|
1308
1321
|
continue;
|
|
@@ -1348,8 +1361,28 @@ impl<'a> LintContext<'a> {
|
|
|
1348
1361
|
let check_info = &lines[check_idx];
|
|
1349
1362
|
if !check_info.is_blank && !check_info.in_code_block && check_info.list_item.is_none() {
|
|
1350
1363
|
// Found non-blank, non-list content
|
|
1351
|
-
if
|
|
1352
|
-
|
|
1364
|
+
// Check if it's indented enough to be a continuation
|
|
1365
|
+
// Get the marker width of the last list item
|
|
1366
|
+
let last_item_marker_width =
|
|
1367
|
+
if last_list_item_line > 0 && last_list_item_line <= lines.len() {
|
|
1368
|
+
lines[last_list_item_line - 1]
|
|
1369
|
+
.list_item
|
|
1370
|
+
.as_ref()
|
|
1371
|
+
.map(|li| {
|
|
1372
|
+
if li.is_ordered {
|
|
1373
|
+
li.marker.len() + 1 // Add 1 for the space after ordered list markers
|
|
1374
|
+
} else {
|
|
1375
|
+
li.marker.len()
|
|
1376
|
+
}
|
|
1377
|
+
})
|
|
1378
|
+
.unwrap_or(3) // fallback to 3 if no list item found
|
|
1379
|
+
} else {
|
|
1380
|
+
3 // fallback
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
let min_continuation = if block.is_ordered { last_item_marker_width } else { 2 };
|
|
1384
|
+
if check_info.indent < min_continuation {
|
|
1385
|
+
// Not indented enough, so it breaks the list
|
|
1353
1386
|
found_non_list = true;
|
|
1354
1387
|
break;
|
|
1355
1388
|
}
|
|
@@ -1364,6 +1397,13 @@ impl<'a> LintContext<'a> {
|
|
|
1364
1397
|
block.end_line = line_num;
|
|
1365
1398
|
block.item_lines.push(line_num);
|
|
1366
1399
|
|
|
1400
|
+
// Update max marker width
|
|
1401
|
+
block.max_marker_width = block.max_marker_width.max(if list_item.is_ordered {
|
|
1402
|
+
list_item.marker.len() + 1
|
|
1403
|
+
} else {
|
|
1404
|
+
list_item.marker.len()
|
|
1405
|
+
});
|
|
1406
|
+
|
|
1367
1407
|
// Update marker consistency for unordered lists
|
|
1368
1408
|
if !block.is_ordered
|
|
1369
1409
|
&& block.marker.is_some()
|
|
@@ -1388,6 +1428,11 @@ impl<'a> LintContext<'a> {
|
|
|
1388
1428
|
blockquote_prefix: blockquote_prefix.clone(),
|
|
1389
1429
|
item_lines: vec![line_num],
|
|
1390
1430
|
nesting_level: nesting,
|
|
1431
|
+
max_marker_width: if list_item.is_ordered {
|
|
1432
|
+
list_item.marker.len() + 1
|
|
1433
|
+
} else {
|
|
1434
|
+
list_item.marker.len()
|
|
1435
|
+
},
|
|
1391
1436
|
};
|
|
1392
1437
|
}
|
|
1393
1438
|
} else {
|
|
@@ -1404,11 +1449,17 @@ impl<'a> LintContext<'a> {
|
|
|
1404
1449
|
blockquote_prefix,
|
|
1405
1450
|
item_lines: vec![line_num],
|
|
1406
1451
|
nesting_level: nesting,
|
|
1452
|
+
max_marker_width: list_item.marker.len(),
|
|
1407
1453
|
});
|
|
1408
1454
|
}
|
|
1409
1455
|
|
|
1410
1456
|
last_list_item_line = line_num;
|
|
1411
1457
|
current_indent_level = item_indent;
|
|
1458
|
+
last_marker_width = if list_item.is_ordered {
|
|
1459
|
+
list_item.marker.len() + 1 // Add 1 for the space after ordered list markers
|
|
1460
|
+
} else {
|
|
1461
|
+
list_item.marker.len()
|
|
1462
|
+
};
|
|
1412
1463
|
} else if let Some(ref mut block) = current_block {
|
|
1413
1464
|
// Not a list item - check if it continues the current block
|
|
1414
1465
|
|
|
@@ -1417,7 +1468,16 @@ impl<'a> LintContext<'a> {
|
|
|
1417
1468
|
// - Blank lines followed by indented content continue the list
|
|
1418
1469
|
// - Everything else ends the list
|
|
1419
1470
|
|
|
1420
|
-
|
|
1471
|
+
// Calculate minimum indentation for list continuation
|
|
1472
|
+
// For ordered lists, use the last marker width (e.g., 3 for "1. ", 4 for "10. ")
|
|
1473
|
+
// For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
|
|
1474
|
+
let min_continuation_indent = if block.is_ordered {
|
|
1475
|
+
current_indent_level + last_marker_width
|
|
1476
|
+
} else {
|
|
1477
|
+
current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
|
|
1478
|
+
};
|
|
1479
|
+
|
|
1480
|
+
if line_info.indent >= min_continuation_indent {
|
|
1421
1481
|
// Indented line continues the list
|
|
1422
1482
|
block.end_line = line_num;
|
|
1423
1483
|
} else if line_info.is_blank {
|
|
@@ -1434,7 +1494,7 @@ impl<'a> LintContext<'a> {
|
|
|
1434
1494
|
if check_idx < lines.len() {
|
|
1435
1495
|
let next_line = &lines[check_idx];
|
|
1436
1496
|
// Check if followed by indented content (list continuation)
|
|
1437
|
-
if !next_line.in_code_block && next_line.indent >=
|
|
1497
|
+
if !next_line.in_code_block && next_line.indent >= min_continuation_indent {
|
|
1438
1498
|
found_continuation = true;
|
|
1439
1499
|
}
|
|
1440
1500
|
// Check if followed by another list item at the same level
|
|
@@ -1461,7 +1521,7 @@ impl<'a> LintContext<'a> {
|
|
|
1461
1521
|
// Code fences or properly indented content
|
|
1462
1522
|
trimmed.starts_with("```")
|
|
1463
1523
|
|| trimmed.starts_with("~~~")
|
|
1464
|
-
|| line_indent >=
|
|
1524
|
+
|| line_indent >= min_continuation_indent
|
|
1465
1525
|
} else {
|
|
1466
1526
|
false
|
|
1467
1527
|
}
|
|
@@ -1489,8 +1549,20 @@ impl<'a> LintContext<'a> {
|
|
|
1489
1549
|
}
|
|
1490
1550
|
} else {
|
|
1491
1551
|
// Check for lazy continuation - non-indented line immediately after a list item
|
|
1492
|
-
|
|
1493
|
-
|
|
1552
|
+
// But only if the line has sufficient indentation for the list type
|
|
1553
|
+
let min_required_indent = if block.is_ordered {
|
|
1554
|
+
current_indent_level + last_marker_width
|
|
1555
|
+
} else {
|
|
1556
|
+
current_indent_level + 2
|
|
1557
|
+
};
|
|
1558
|
+
|
|
1559
|
+
// For lazy continuation to apply, the line must either:
|
|
1560
|
+
// 1. Have no indentation (true lazy continuation)
|
|
1561
|
+
// 2. Have sufficient indentation for the list type
|
|
1562
|
+
let is_lazy_continuation = last_list_item_line == line_num - 1
|
|
1563
|
+
&& line_info.heading.is_none()
|
|
1564
|
+
&& !line_info.is_blank
|
|
1565
|
+
&& (line_info.indent == 0 || line_info.indent >= min_required_indent);
|
|
1494
1566
|
|
|
1495
1567
|
if is_lazy_continuation {
|
|
1496
1568
|
// Additional check: if the line starts with uppercase and looks like a new sentence,
|
|
@@ -1964,6 +2036,9 @@ impl<'a> ListBlockMerger<'a> {
|
|
|
1964
2036
|
current.end_line = next.end_line;
|
|
1965
2037
|
current.item_lines.extend_from_slice(&next.item_lines);
|
|
1966
2038
|
|
|
2039
|
+
// Update max marker width
|
|
2040
|
+
current.max_marker_width = current.max_marker_width.max(next.max_marker_width);
|
|
2041
|
+
|
|
1967
2042
|
// Handle marker consistency for unordered lists
|
|
1968
2043
|
if !current.is_ordered && self.markers_differ(¤t, next) {
|
|
1969
2044
|
current.marker = None; // Mixed markers
|
|
@@ -2004,8 +2079,15 @@ fn has_meaningful_content_between(current: &ListBlock, next: &ListBlock, lines:
|
|
|
2004
2079
|
let line_indent = line_info.content.len() - line_info.content.trim_start().len();
|
|
2005
2080
|
|
|
2006
2081
|
// If the line is indented enough to be list continuation content, it's meaningful
|
|
2007
|
-
//
|
|
2008
|
-
|
|
2082
|
+
// For ordered lists, use actual marker width; for unordered, 2 spaces
|
|
2083
|
+
let min_indent = if current.is_ordered {
|
|
2084
|
+
current.nesting_level + current.max_marker_width
|
|
2085
|
+
} else {
|
|
2086
|
+
current.nesting_level + 2
|
|
2087
|
+
};
|
|
2088
|
+
|
|
2089
|
+
// Check if the line has sufficient indentation to be a continuation
|
|
2090
|
+
if line_indent >= min_indent {
|
|
2009
2091
|
return true;
|
|
2010
2092
|
}
|
|
2011
2093
|
|
|
@@ -219,9 +219,12 @@ enum Commands {
|
|
|
219
219
|
},
|
|
220
220
|
/// Install the rumdl VS Code extension
|
|
221
221
|
Vscode {
|
|
222
|
-
/// Force reinstall even if already installed
|
|
222
|
+
/// Force reinstall the current version even if already installed
|
|
223
223
|
#[arg(long)]
|
|
224
224
|
force: bool,
|
|
225
|
+
/// Update to the latest version (only if newer version available)
|
|
226
|
+
#[arg(long)]
|
|
227
|
+
update: bool,
|
|
225
228
|
/// Show installation status without installing
|
|
226
229
|
#[arg(long)]
|
|
227
230
|
status: bool,
|
|
@@ -1782,9 +1785,9 @@ build-backend = \"setuptools.build_meta\"
|
|
|
1782
1785
|
}
|
|
1783
1786
|
}
|
|
1784
1787
|
}
|
|
1785
|
-
Some(Commands::Vscode { force, status }) => {
|
|
1788
|
+
Some(Commands::Vscode { force, update, status }) => {
|
|
1786
1789
|
// Handle VS Code extension installation
|
|
1787
|
-
match rumdl::vscode::handle_vscode_command(*force, *status) {
|
|
1790
|
+
match rumdl::vscode::handle_vscode_command(*force, *update, *status) {
|
|
1788
1791
|
Ok(_) => {}
|
|
1789
1792
|
Err(e) => {
|
|
1790
1793
|
eprintln!("{}: {}", "Error".red().bold(), e);
|
|
@@ -55,37 +55,56 @@ impl Rule for MD027MultipleSpacesBlockquote {
|
|
|
55
55
|
if let Some(blockquote) = &line_info.blockquote {
|
|
56
56
|
// Part 1: Check for multiple spaces after the blockquote marker
|
|
57
57
|
if blockquote.has_multiple_spaces_after_marker {
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
let
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
58
|
+
// Find where the extra spaces start in the line
|
|
59
|
+
// We need to find the position after the markers and first space/tab
|
|
60
|
+
let mut byte_pos = 0;
|
|
61
|
+
let mut found_markers = 0;
|
|
62
|
+
let mut found_first_space = false;
|
|
63
|
+
|
|
64
|
+
for (i, ch) in line_info.content.char_indices() {
|
|
65
|
+
if found_markers < blockquote.nesting_level {
|
|
66
|
+
if ch == '>' {
|
|
67
|
+
found_markers += 1;
|
|
68
|
+
}
|
|
69
|
+
} else if !found_first_space && (ch == ' ' || ch == '\t') {
|
|
70
|
+
// This is the first space/tab after markers
|
|
71
|
+
found_first_space = true;
|
|
72
|
+
} else if found_first_space && (ch == ' ' || ch == '\t') {
|
|
73
|
+
// This is where extra spaces start
|
|
74
|
+
byte_pos = i;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
79
|
+
// Count how many extra spaces/tabs there are
|
|
80
|
+
let extra_spaces_bytes = line_info.content[byte_pos..]
|
|
81
|
+
.chars()
|
|
82
|
+
.take_while(|&c| c == ' ' || c == '\t')
|
|
83
|
+
.fold(0, |acc, ch| acc + ch.len_utf8());
|
|
84
|
+
|
|
85
|
+
if extra_spaces_bytes > 0 {
|
|
86
|
+
let (start_line, start_col, end_line, end_col) =
|
|
87
|
+
calculate_match_range(line_num, &line_info.content, byte_pos, extra_spaces_bytes);
|
|
88
|
+
|
|
89
|
+
warnings.push(LintWarning {
|
|
90
|
+
rule_name: Some(self.name()),
|
|
91
|
+
line: start_line,
|
|
92
|
+
column: start_col,
|
|
93
|
+
end_line,
|
|
94
|
+
end_column: end_col,
|
|
95
|
+
message: "Multiple spaces after quote marker (>)".to_string(),
|
|
96
|
+
severity: Severity::Warning,
|
|
97
|
+
fix: Some(Fix {
|
|
98
|
+
range: {
|
|
99
|
+
let line_index = LineIndex::new(ctx.content.to_string());
|
|
100
|
+
let start_byte = line_index.line_col_to_byte_range(line_num, start_col).start;
|
|
101
|
+
let end_byte = line_index.line_col_to_byte_range(line_num, end_col).start;
|
|
102
|
+
start_byte..end_byte
|
|
103
|
+
},
|
|
104
|
+
replacement: "".to_string(), // Remove the extra spaces
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
89
108
|
}
|
|
90
109
|
} else {
|
|
91
110
|
// Part 2: Check for malformed blockquote attempts on non-blockquote lines
|
|
@@ -515,4 +534,61 @@ mod tests {
|
|
|
515
534
|
let fixed = rule.fix(&ctx).unwrap();
|
|
516
535
|
assert_eq!(fixed, " > Indented with multiple spaces");
|
|
517
536
|
}
|
|
537
|
+
|
|
538
|
+
#[test]
|
|
539
|
+
fn test_tabs_after_marker() {
|
|
540
|
+
let rule = MD027MultipleSpacesBlockquote;
|
|
541
|
+
// Tab after marker - should be flagged as multiple spaces
|
|
542
|
+
let content = ">\tTab after marker";
|
|
543
|
+
let ctx = LintContext::new(content);
|
|
544
|
+
let result = rule.check(&ctx).unwrap();
|
|
545
|
+
assert_eq!(result.len(), 1, "Tab after marker should be flagged");
|
|
546
|
+
assert_eq!(result[0].message, "Multiple spaces after quote marker (>)");
|
|
547
|
+
|
|
548
|
+
// Tab and space after marker
|
|
549
|
+
let content2 = ">\t Space then tab";
|
|
550
|
+
let ctx2 = LintContext::new(content2);
|
|
551
|
+
let result2 = rule.check(&ctx2).unwrap();
|
|
552
|
+
assert_eq!(result2.len(), 1, "Tab and space should be flagged");
|
|
553
|
+
|
|
554
|
+
// Two tabs after marker
|
|
555
|
+
let content3 = ">\t\tTwo tabs";
|
|
556
|
+
let ctx3 = LintContext::new(content3);
|
|
557
|
+
let result3 = rule.check(&ctx3).unwrap();
|
|
558
|
+
assert_eq!(result3.len(), 1, "Two tabs should be flagged");
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
#[test]
|
|
562
|
+
fn test_mixed_spaces_and_tabs() {
|
|
563
|
+
let rule = MD027MultipleSpacesBlockquote;
|
|
564
|
+
// Space then tab
|
|
565
|
+
let content = "> \tSpace then tab";
|
|
566
|
+
let ctx = LintContext::new(content);
|
|
567
|
+
let result = rule.check(&ctx).unwrap();
|
|
568
|
+
assert_eq!(result.len(), 1);
|
|
569
|
+
assert_eq!(result[0].column, 3); // Points to the tab
|
|
570
|
+
|
|
571
|
+
// Tab then space
|
|
572
|
+
let content2 = ">\t Tab then space";
|
|
573
|
+
let ctx2 = LintContext::new(content2);
|
|
574
|
+
let result2 = rule.check(&ctx2).unwrap();
|
|
575
|
+
assert_eq!(result2.len(), 1);
|
|
576
|
+
assert_eq!(result2[0].column, 3); // Points to the space after tab
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
#[test]
|
|
580
|
+
fn test_fix_tabs() {
|
|
581
|
+
let rule = MD027MultipleSpacesBlockquote;
|
|
582
|
+
// Fix should remove extra tabs
|
|
583
|
+
let content = ">\t\tTwo tabs";
|
|
584
|
+
let ctx = LintContext::new(content);
|
|
585
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
586
|
+
assert_eq!(fixed, "> Two tabs");
|
|
587
|
+
|
|
588
|
+
// Fix mixed spaces and tabs
|
|
589
|
+
let content2 = "> \t Mixed";
|
|
590
|
+
let ctx2 = LintContext::new(content2);
|
|
591
|
+
let fixed2 = rule.fix(&ctx2).unwrap();
|
|
592
|
+
assert_eq!(fixed2, "> Mixed");
|
|
593
|
+
}
|
|
518
594
|
}
|