rumdl 0.0.118__tar.gz → 0.0.120__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.118 → rumdl-0.0.120}/CHANGELOG.md +21 -3
- {rumdl-0.0.118 → rumdl-0.0.120}/Cargo.lock +13 -13
- {rumdl-0.0.118 → rumdl-0.0.120}/Cargo.toml +2 -1
- {rumdl-0.0.118 → rumdl-0.0.120}/PKG-INFO +1 -1
- {rumdl-0.0.118 → rumdl-0.0.120}/src/lint_context.rs +270 -58
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md007_ul_indent.rs +1 -25
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md029_ordered_list_prefix.rs +81 -48
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md051_link_fragments.rs +194 -150
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md057_existing_relative_links.rs +0 -13
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/code_block_utils.rs +113 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/document_structure.rs +0 -8
- rumdl-0.0.120/src/utils/header_id_utils.rs +349 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/kramdown_utils.rs +73 -156
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/mod.rs +1 -0
- rumdl-0.0.120/tests/rules/md029_code_block_separation_test.rs +304 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_issue42_test.rs +21 -20
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_test.rs +317 -12
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_unicode_test.rs +2 -2
- rumdl-0.0.120/tests/rules/md051_issue_39_regression_test.rs +232 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md051_test.rs +382 -25
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md051_unicode_test.rs +13 -14
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/mod.rs +3 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/.config/nextest.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/.mise.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/.rumdl.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/.rustfmt.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/LICENSE +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/MANIFEST.in +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/Makefile +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/README.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/assets/logo.png +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benches/range_performance.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/RULES.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/global-settings.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md001.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md002.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md003.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md004.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md005.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md006.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md007.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md009.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md010.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md011.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md012.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md013.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md014.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md018.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md019.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md020.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md021.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md022.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md023.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md024.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md025.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md026.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md027.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md028.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md029.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md030.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md031.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md032.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md033.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md034.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md035.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md036.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md037.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md038.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md039.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md040.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md041.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md042.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md043.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md044.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md045.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md046.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md047.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md048.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md049.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md050.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md051.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md052.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md053.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md054.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md055.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md056.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md057.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/md058.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/parity_check.py +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/pyproject.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/python/MANIFEST.in +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/rumdl.toml.example +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/rust-toolchain.toml +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/exit_codes.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/inline_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/lib.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/server.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/types.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/main.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/output/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/parallel.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/performance.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/profiling.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/python.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rule.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rule_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/skip_context.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/src/vscode.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/init_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/lib.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/perf_check.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.120] - 2025-08-16
|
|
11
|
+
|
|
12
|
+
## [0.0.119] - 2025-08-15
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- **MD051**: Fixed GitHub anchor generation algorithm to correctly handle consecutive spaces
|
|
16
|
+
- "Test & Heading!" now correctly generates "test--heading" instead of "test-heading"
|
|
17
|
+
- Improved compliance with GitHub's official anchor generation behavior
|
|
18
|
+
- Fixed whitespace normalization bug that was collapsing multiple spaces to single spaces
|
|
19
|
+
|
|
20
|
+
### Improved
|
|
21
|
+
- **Code Quality**: Removed all `#[allow(dead_code)]` violations in codebase
|
|
22
|
+
- Removed unused `InternalCodeBlockState` enum from document_structure.rs
|
|
23
|
+
- Removed unused `extract_url_from_link` function from md057_existing_relative_links.rs
|
|
24
|
+
- Removed unused `is_in_code_block` function from md007_ul_indent.rs
|
|
25
|
+
|
|
10
26
|
## [0.0.118] - 2025-08-14
|
|
11
27
|
|
|
12
28
|
## [0.0.117] - 2025-08-14
|
|
@@ -124,7 +140,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
124
140
|
## [0.0.99] - 2025-07-22
|
|
125
141
|
|
|
126
142
|
### Fixed
|
|
127
|
-
- MD034: Added support for `ftps://` URLs
|
|
143
|
+
- MD034: Added support for `ftps://` URLs
|
|
128
144
|
- MD034: Fixed detection of URLs in HTML comments (now properly ignored)
|
|
129
145
|
- MD039: Fixed escaped character handling in link text
|
|
130
146
|
- MD044: Fixed clippy warnings and improved pattern matching for proper names
|
|
@@ -202,7 +218,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
202
218
|
### Performance Improvements
|
|
203
219
|
- Implemented lazy code span loading - 3.8x speedup for 94% of rules that don't use code spans
|
|
204
220
|
- MD013: 34.5% faster check operations through aggressive early returns
|
|
205
|
-
- MD038: 14% faster by leveraging lazy code span loading
|
|
221
|
+
- MD038: 14% faster by leveraging lazy code span loading
|
|
206
222
|
- MD044: 93.5% faster with global regex caching
|
|
207
223
|
- MD047: 8.3% faster using pre-computed line data
|
|
208
224
|
- MD053: 39.7% faster by leveraging pre-parsed reference definitions
|
|
@@ -337,7 +353,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
337
353
|
|
|
338
354
|
- Initial implementation of remaining rules for markdownlint parity
|
|
339
355
|
|
|
340
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
356
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.120...HEAD
|
|
357
|
+
[0.0.120]: https://github.com/rvben/rumdl/compare/v0.0.119...v0.0.120
|
|
358
|
+
[0.0.119]: https://github.com/rvben/rumdl/compare/v0.0.118...v0.0.119
|
|
341
359
|
[0.0.118]: https://github.com/rvben/rumdl/compare/v0.0.117...v0.0.118
|
|
342
360
|
[0.0.117]: https://github.com/rvben/rumdl/compare/v0.0.116...v0.0.117
|
|
343
361
|
[0.0.116]: https://github.com/rvben/rumdl/compare/v0.0.115...v0.0.116
|
|
@@ -185,9 +185,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
|
|
185
185
|
|
|
186
186
|
[[package]]
|
|
187
187
|
name = "bitflags"
|
|
188
|
-
version = "2.9.
|
|
188
|
+
version = "2.9.2"
|
|
189
189
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
190
|
-
checksum = "
|
|
190
|
+
checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29"
|
|
191
191
|
|
|
192
192
|
[[package]]
|
|
193
193
|
name = "bstr"
|
|
@@ -220,9 +220,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
|
|
220
220
|
|
|
221
221
|
[[package]]
|
|
222
222
|
name = "cc"
|
|
223
|
-
version = "1.2.
|
|
223
|
+
version = "1.2.33"
|
|
224
224
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
225
|
-
checksum = "
|
|
225
|
+
checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f"
|
|
226
226
|
dependencies = [
|
|
227
227
|
"shlex",
|
|
228
228
|
]
|
|
@@ -863,7 +863,7 @@ version = "0.7.9"
|
|
|
863
863
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
864
864
|
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
|
|
865
865
|
dependencies = [
|
|
866
|
-
"bitflags 2.9.
|
|
866
|
+
"bitflags 2.9.2",
|
|
867
867
|
"cfg-if",
|
|
868
868
|
"libc",
|
|
869
869
|
]
|
|
@@ -1280,7 +1280,7 @@ checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f"
|
|
|
1280
1280
|
dependencies = [
|
|
1281
1281
|
"bit-set",
|
|
1282
1282
|
"bit-vec",
|
|
1283
|
-
"bitflags 2.9.
|
|
1283
|
+
"bitflags 2.9.2",
|
|
1284
1284
|
"lazy_static",
|
|
1285
1285
|
"num-traits",
|
|
1286
1286
|
"rand",
|
|
@@ -1298,7 +1298,7 @@ version = "0.12.2"
|
|
|
1298
1298
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1299
1299
|
checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14"
|
|
1300
1300
|
dependencies = [
|
|
1301
|
-
"bitflags 2.9.
|
|
1301
|
+
"bitflags 2.9.2",
|
|
1302
1302
|
"getopts",
|
|
1303
1303
|
"memchr",
|
|
1304
1304
|
"pulldown-cmark-escape",
|
|
@@ -1459,7 +1459,7 @@ version = "0.5.17"
|
|
|
1459
1459
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1460
1460
|
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
|
|
1461
1461
|
dependencies = [
|
|
1462
|
-
"bitflags 2.9.
|
|
1462
|
+
"bitflags 2.9.2",
|
|
1463
1463
|
]
|
|
1464
1464
|
|
|
1465
1465
|
[[package]]
|
|
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|
|
1493
1493
|
|
|
1494
1494
|
[[package]]
|
|
1495
1495
|
name = "rumdl"
|
|
1496
|
-
version = "0.0.
|
|
1496
|
+
version = "0.0.120"
|
|
1497
1497
|
dependencies = [
|
|
1498
1498
|
"anyhow",
|
|
1499
1499
|
"assert_cmd",
|
|
@@ -1555,7 +1555,7 @@ version = "1.0.8"
|
|
|
1555
1555
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1556
1556
|
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
|
|
1557
1557
|
dependencies = [
|
|
1558
|
-
"bitflags 2.9.
|
|
1558
|
+
"bitflags 2.9.2",
|
|
1559
1559
|
"errno",
|
|
1560
1560
|
"libc",
|
|
1561
1561
|
"linux-raw-sys",
|
|
@@ -1723,9 +1723,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|
|
1723
1723
|
|
|
1724
1724
|
[[package]]
|
|
1725
1725
|
name = "syn"
|
|
1726
|
-
version = "2.0.
|
|
1726
|
+
version = "2.0.106"
|
|
1727
1727
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1728
|
-
checksum = "
|
|
1728
|
+
checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
|
|
1729
1729
|
dependencies = [
|
|
1730
1730
|
"proc-macro2",
|
|
1731
1731
|
"quote",
|
|
@@ -2434,7 +2434,7 @@ version = "0.39.0"
|
|
|
2434
2434
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2435
2435
|
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
|
|
2436
2436
|
dependencies = [
|
|
2437
|
-
"bitflags 2.9.
|
|
2437
|
+
"bitflags 2.9.2",
|
|
2438
2438
|
]
|
|
2439
2439
|
|
|
2440
2440
|
[[package]]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.120"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
rust-version = "1.89.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
@@ -24,6 +24,7 @@ crate-type = ["cdylib", "rlib"]
|
|
|
24
24
|
name = "rumdl"
|
|
25
25
|
path = "src/main.rs"
|
|
26
26
|
|
|
27
|
+
|
|
27
28
|
# Benchmark binaries - only built when explicitly requested
|
|
28
29
|
[[bin]]
|
|
29
30
|
name = "benchmark"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use crate::utils::code_block_utils::CodeBlockUtils;
|
|
1
|
+
use crate::utils::code_block_utils::{CodeBlockContext, CodeBlockUtils};
|
|
2
2
|
use lazy_static::lazy_static;
|
|
3
3
|
use regex::Regex;
|
|
4
4
|
|
|
@@ -1154,7 +1154,19 @@ impl<'a> LintContext<'a> {
|
|
|
1154
1154
|
|
|
1155
1155
|
// Extract custom header ID if present
|
|
1156
1156
|
let raw_text = text.trim().to_string();
|
|
1157
|
-
let (clean_text, custom_id) = crate::utils::
|
|
1157
|
+
let (clean_text, mut custom_id) = crate::utils::header_id_utils::extract_header_id(&raw_text);
|
|
1158
|
+
|
|
1159
|
+
// If no custom ID was found on the header line, check the next line for standalone attr-list
|
|
1160
|
+
if custom_id.is_none() && i + 1 < content_lines.len() && i + 1 < lines.len() {
|
|
1161
|
+
let next_line = content_lines[i + 1];
|
|
1162
|
+
if !lines[i + 1].in_code_block
|
|
1163
|
+
&& crate::utils::header_id_utils::is_standalone_attr_list(next_line)
|
|
1164
|
+
&& let Some(next_line_id) =
|
|
1165
|
+
crate::utils::header_id_utils::extract_standalone_attr_list_id(next_line)
|
|
1166
|
+
{
|
|
1167
|
+
custom_id = Some(next_line_id);
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1158
1170
|
|
|
1159
1171
|
lines[i].heading = Some(HeadingInfo {
|
|
1160
1172
|
level,
|
|
@@ -1188,7 +1200,19 @@ impl<'a> LintContext<'a> {
|
|
|
1188
1200
|
|
|
1189
1201
|
// Extract custom header ID if present
|
|
1190
1202
|
let raw_text = line.trim().to_string();
|
|
1191
|
-
let (clean_text, custom_id) = crate::utils::
|
|
1203
|
+
let (clean_text, mut custom_id) = crate::utils::header_id_utils::extract_header_id(&raw_text);
|
|
1204
|
+
|
|
1205
|
+
// If no custom ID was found on the header line, check the line after underline for standalone attr-list
|
|
1206
|
+
if custom_id.is_none() && i + 2 < content_lines.len() && i + 2 < lines.len() {
|
|
1207
|
+
let attr_line = content_lines[i + 2];
|
|
1208
|
+
if !lines[i + 2].in_code_block
|
|
1209
|
+
&& crate::utils::header_id_utils::is_standalone_attr_list(attr_line)
|
|
1210
|
+
&& let Some(attr_line_id) =
|
|
1211
|
+
crate::utils::header_id_utils::extract_standalone_attr_list_id(attr_line)
|
|
1212
|
+
{
|
|
1213
|
+
custom_id = Some(attr_line_id);
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1192
1216
|
|
|
1193
1217
|
lines[i].heading = Some(HeadingInfo {
|
|
1194
1218
|
level,
|
|
@@ -1328,31 +1352,37 @@ impl<'a> LintContext<'a> {
|
|
|
1328
1352
|
for (line_idx, line_info) in lines.iter().enumerate() {
|
|
1329
1353
|
let line_num = line_idx + 1;
|
|
1330
1354
|
|
|
1331
|
-
//
|
|
1355
|
+
// Enhanced code block handling using Design #3's context analysis
|
|
1332
1356
|
if line_info.in_code_block {
|
|
1333
1357
|
if let Some(ref mut block) = current_block {
|
|
1334
|
-
// For code blocks to continue a list, they need to be indented
|
|
1335
|
-
// at least 2 spaces beyond the list marker
|
|
1336
1358
|
// Calculate minimum indentation for list continuation
|
|
1337
|
-
|
|
1338
|
-
// For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
|
|
1339
|
-
let min_continuation_indent = if block.is_ordered {
|
|
1340
|
-
current_indent_level + last_marker_width
|
|
1341
|
-
} else {
|
|
1342
|
-
current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
|
|
1343
|
-
};
|
|
1359
|
+
let min_continuation_indent = CodeBlockUtils::calculate_min_continuation_indent(lines, line_idx);
|
|
1344
1360
|
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1361
|
+
// Analyze code block context using the three-tier classification
|
|
1362
|
+
let context = CodeBlockUtils::analyze_code_block_context(lines, line_idx, min_continuation_indent);
|
|
1363
|
+
|
|
1364
|
+
match context {
|
|
1365
|
+
CodeBlockContext::Indented => {
|
|
1366
|
+
// Code block is properly indented - continues the list
|
|
1367
|
+
block.end_line = line_num;
|
|
1368
|
+
continue;
|
|
1369
|
+
}
|
|
1370
|
+
CodeBlockContext::Standalone => {
|
|
1371
|
+
// Code block separates lists - end current block
|
|
1372
|
+
let completed_block = current_block.take().unwrap();
|
|
1373
|
+
list_blocks.push(completed_block);
|
|
1374
|
+
continue;
|
|
1375
|
+
}
|
|
1376
|
+
CodeBlockContext::Adjacent => {
|
|
1377
|
+
// Edge case - use conservative behavior (continue list)
|
|
1378
|
+
block.end_line = line_num;
|
|
1379
|
+
continue;
|
|
1380
|
+
}
|
|
1349
1381
|
}
|
|
1382
|
+
} else {
|
|
1383
|
+
// No current list block - skip code block lines
|
|
1384
|
+
continue;
|
|
1350
1385
|
}
|
|
1351
|
-
// If we have a current block and hit a non-indented code block, end it
|
|
1352
|
-
if let Some(block) = current_block.take() {
|
|
1353
|
-
list_blocks.push(block);
|
|
1354
|
-
}
|
|
1355
|
-
continue;
|
|
1356
1386
|
}
|
|
1357
1387
|
|
|
1358
1388
|
// Extract blockquote prefix if any
|
|
@@ -1385,17 +1415,18 @@ impl<'a> LintContext<'a> {
|
|
|
1385
1415
|
// Check if there's non-list content between the last item and this one
|
|
1386
1416
|
let has_non_list_content = {
|
|
1387
1417
|
let mut found_non_list = false;
|
|
1388
|
-
|
|
1418
|
+
// Use the last item from the current block, not the global last_list_item_line
|
|
1419
|
+
let block_last_item_line = block.item_lines.last().copied().unwrap_or(block.end_line);
|
|
1420
|
+
for check_line in (block_last_item_line + 1)..line_num {
|
|
1389
1421
|
let check_idx = check_line - 1;
|
|
1390
1422
|
if check_idx < lines.len() {
|
|
1391
1423
|
let check_info = &lines[check_idx];
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
//
|
|
1395
|
-
// Get the marker width of the last list item
|
|
1424
|
+
// Check for content that breaks the list
|
|
1425
|
+
let is_list_breaking_content = if check_info.in_code_block {
|
|
1426
|
+
// Use enhanced code block classification for list separation
|
|
1396
1427
|
let last_item_marker_width =
|
|
1397
|
-
if
|
|
1398
|
-
lines[
|
|
1428
|
+
if block_last_item_line > 0 && block_last_item_line <= lines.len() {
|
|
1429
|
+
lines[block_last_item_line - 1]
|
|
1399
1430
|
.list_item
|
|
1400
1431
|
.as_ref()
|
|
1401
1432
|
.map(|li| {
|
|
@@ -1411,11 +1442,61 @@ impl<'a> LintContext<'a> {
|
|
|
1411
1442
|
};
|
|
1412
1443
|
|
|
1413
1444
|
let min_continuation = if block.is_ordered { last_item_marker_width } else { 2 };
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1445
|
+
|
|
1446
|
+
// Analyze code block context using our enhanced classification
|
|
1447
|
+
let context = CodeBlockUtils::analyze_code_block_context(
|
|
1448
|
+
lines,
|
|
1449
|
+
check_line - 1,
|
|
1450
|
+
min_continuation,
|
|
1451
|
+
);
|
|
1452
|
+
|
|
1453
|
+
// Standalone code blocks break lists, indented ones continue them
|
|
1454
|
+
matches!(context, CodeBlockContext::Standalone)
|
|
1455
|
+
} else if !check_info.is_blank && check_info.list_item.is_none() {
|
|
1456
|
+
// Check for structural separators that should break lists (from issue #42)
|
|
1457
|
+
let line_content = check_info.content.trim();
|
|
1458
|
+
|
|
1459
|
+
// Any of these structural separators break lists
|
|
1460
|
+
if check_info.heading.is_some()
|
|
1461
|
+
|| line_content.starts_with("---")
|
|
1462
|
+
|| line_content.starts_with("***")
|
|
1463
|
+
|| line_content.starts_with("___")
|
|
1464
|
+
|| line_content.contains('|')
|
|
1465
|
+
|| line_content.starts_with(">")
|
|
1466
|
+
{
|
|
1467
|
+
true
|
|
1468
|
+
}
|
|
1469
|
+
// Other non-list content - check if properly indented
|
|
1470
|
+
else {
|
|
1471
|
+
let last_item_marker_width =
|
|
1472
|
+
if block_last_item_line > 0 && block_last_item_line <= lines.len() {
|
|
1473
|
+
lines[block_last_item_line - 1]
|
|
1474
|
+
.list_item
|
|
1475
|
+
.as_ref()
|
|
1476
|
+
.map(|li| {
|
|
1477
|
+
if li.is_ordered {
|
|
1478
|
+
li.marker.len() + 1 // Add 1 for the space after ordered list markers
|
|
1479
|
+
} else {
|
|
1480
|
+
li.marker.len()
|
|
1481
|
+
}
|
|
1482
|
+
})
|
|
1483
|
+
.unwrap_or(3) // fallback to 3 if no list item found
|
|
1484
|
+
} else {
|
|
1485
|
+
3 // fallback
|
|
1486
|
+
};
|
|
1487
|
+
|
|
1488
|
+
let min_continuation =
|
|
1489
|
+
if block.is_ordered { last_item_marker_width } else { 2 };
|
|
1490
|
+
check_info.indent < min_continuation
|
|
1418
1491
|
}
|
|
1492
|
+
} else {
|
|
1493
|
+
false
|
|
1494
|
+
};
|
|
1495
|
+
|
|
1496
|
+
if is_list_breaking_content {
|
|
1497
|
+
// Not indented enough, so it breaks the list
|
|
1498
|
+
found_non_list = true;
|
|
1499
|
+
break;
|
|
1419
1500
|
}
|
|
1420
1501
|
}
|
|
1421
1502
|
}
|
|
@@ -1550,8 +1631,9 @@ impl<'a> LintContext<'a> {
|
|
|
1550
1631
|
&& item.is_ordered == block.is_ordered
|
|
1551
1632
|
&& block.blockquote_prefix.trim() == next_blockquote_prefix.trim()
|
|
1552
1633
|
{
|
|
1553
|
-
// Check if there was meaningful content between the list items
|
|
1554
|
-
|
|
1634
|
+
// Check if there was meaningful content between the list items (unused now)
|
|
1635
|
+
// This variable is kept for potential future use but is currently replaced by has_structural_separators
|
|
1636
|
+
let _has_meaningful_content = (line_idx + 1..check_idx).any(|idx| {
|
|
1555
1637
|
if let Some(between_line) = lines.get(idx) {
|
|
1556
1638
|
let trimmed = between_line.content.trim();
|
|
1557
1639
|
// Skip empty lines
|
|
@@ -1561,21 +1643,72 @@ impl<'a> LintContext<'a> {
|
|
|
1561
1643
|
// Check for meaningful content
|
|
1562
1644
|
let line_indent =
|
|
1563
1645
|
between_line.content.len() - between_line.content.trim_start().len();
|
|
1564
|
-
|
|
1565
|
-
|
|
1646
|
+
|
|
1647
|
+
// Structural separators (code fences, headings, etc.) are meaningful and should BREAK lists
|
|
1648
|
+
if trimmed.starts_with("```")
|
|
1566
1649
|
|| trimmed.starts_with("~~~")
|
|
1567
|
-
||
|
|
1650
|
+
|| trimmed.starts_with("---")
|
|
1651
|
+
|| trimmed.starts_with("***")
|
|
1652
|
+
|| trimmed.starts_with("___")
|
|
1653
|
+
|| trimmed.starts_with(">")
|
|
1654
|
+
|| trimmed.contains('|') // Tables
|
|
1655
|
+
|| between_line.heading.is_some()
|
|
1656
|
+
{
|
|
1657
|
+
return true; // These are structural separators - meaningful content that breaks lists
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
// Only properly indented content continues the list
|
|
1661
|
+
line_indent >= min_continuation_indent
|
|
1568
1662
|
} else {
|
|
1569
1663
|
false
|
|
1570
1664
|
}
|
|
1571
1665
|
});
|
|
1572
1666
|
|
|
1573
1667
|
if block.is_ordered {
|
|
1574
|
-
// For ordered lists:
|
|
1575
|
-
|
|
1668
|
+
// For ordered lists: don't continue if there are structural separators
|
|
1669
|
+
// Check if there are structural separators between the list items
|
|
1670
|
+
let has_structural_separators = (line_idx + 1..check_idx).any(|idx| {
|
|
1671
|
+
if let Some(between_line) = lines.get(idx) {
|
|
1672
|
+
let trimmed = between_line.content.trim();
|
|
1673
|
+
if trimmed.is_empty() {
|
|
1674
|
+
return false;
|
|
1675
|
+
}
|
|
1676
|
+
// Check for structural separators that break lists
|
|
1677
|
+
trimmed.starts_with("```")
|
|
1678
|
+
|| trimmed.starts_with("~~~")
|
|
1679
|
+
|| trimmed.starts_with("---")
|
|
1680
|
+
|| trimmed.starts_with("***")
|
|
1681
|
+
|| trimmed.starts_with("___")
|
|
1682
|
+
|| trimmed.starts_with(">")
|
|
1683
|
+
|| trimmed.contains('|') // Tables
|
|
1684
|
+
|| between_line.heading.is_some()
|
|
1685
|
+
} else {
|
|
1686
|
+
false
|
|
1687
|
+
}
|
|
1688
|
+
});
|
|
1689
|
+
found_continuation = !has_structural_separators;
|
|
1576
1690
|
} else {
|
|
1577
|
-
// For unordered lists:
|
|
1578
|
-
|
|
1691
|
+
// For unordered lists: also check for structural separators
|
|
1692
|
+
let has_structural_separators = (line_idx + 1..check_idx).any(|idx| {
|
|
1693
|
+
if let Some(between_line) = lines.get(idx) {
|
|
1694
|
+
let trimmed = between_line.content.trim();
|
|
1695
|
+
if trimmed.is_empty() {
|
|
1696
|
+
return false;
|
|
1697
|
+
}
|
|
1698
|
+
// Check for structural separators that break lists
|
|
1699
|
+
trimmed.starts_with("```")
|
|
1700
|
+
|| trimmed.starts_with("~~~")
|
|
1701
|
+
|| trimmed.starts_with("---")
|
|
1702
|
+
|| trimmed.starts_with("***")
|
|
1703
|
+
|| trimmed.starts_with("___")
|
|
1704
|
+
|| trimmed.starts_with(">")
|
|
1705
|
+
|| trimmed.contains('|') // Tables
|
|
1706
|
+
|| between_line.heading.is_some()
|
|
1707
|
+
} else {
|
|
1708
|
+
false
|
|
1709
|
+
}
|
|
1710
|
+
});
|
|
1711
|
+
found_continuation = !has_structural_separators;
|
|
1579
1712
|
}
|
|
1580
1713
|
}
|
|
1581
1714
|
}
|
|
@@ -1601,8 +1734,19 @@ impl<'a> LintContext<'a> {
|
|
|
1601
1734
|
// For lazy continuation to apply, the line must either:
|
|
1602
1735
|
// 1. Have no indentation (true lazy continuation)
|
|
1603
1736
|
// 2. Have sufficient indentation for the list type
|
|
1737
|
+
// BUT structural separators (headings, code blocks, etc.) should never be lazy continuations
|
|
1738
|
+
let line_content = line_info.content.trim();
|
|
1739
|
+
let is_structural_separator = line_info.heading.is_some()
|
|
1740
|
+
|| line_content.starts_with("```")
|
|
1741
|
+
|| line_content.starts_with("~~~")
|
|
1742
|
+
|| line_content.starts_with("---")
|
|
1743
|
+
|| line_content.starts_with("***")
|
|
1744
|
+
|| line_content.starts_with("___")
|
|
1745
|
+
|| line_content.starts_with(">")
|
|
1746
|
+
|| line_content.contains('|'); // Tables
|
|
1747
|
+
|
|
1604
1748
|
let is_lazy_continuation = last_list_item_line == line_num - 1
|
|
1605
|
-
&&
|
|
1749
|
+
&& !is_structural_separator
|
|
1606
1750
|
&& !line_info.is_blank
|
|
1607
1751
|
&& (line_info.indent == 0 || line_info.indent >= min_required_indent);
|
|
1608
1752
|
|
|
@@ -2051,14 +2195,25 @@ impl<'a> ListBlockMerger<'a> {
|
|
|
2051
2195
|
|
|
2052
2196
|
/// Check if unordered lists can be merged with a single blank line between
|
|
2053
2197
|
fn can_merge_with_blank_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
2198
|
+
// Check if there are structural separators between the blocks
|
|
2199
|
+
// If has_meaningful_content_between returns true, it means there are structural separators
|
|
2200
|
+
if has_meaningful_content_between(current, next, self.lines) {
|
|
2201
|
+
return false; // Structural separators prevent merging
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2054
2204
|
// Only merge unordered lists with same marker across single blank
|
|
2055
2205
|
!current.is_ordered && current.marker == next.marker
|
|
2056
2206
|
}
|
|
2057
2207
|
|
|
2058
2208
|
/// Check if ordered lists can be merged when there's content between them
|
|
2059
2209
|
fn can_merge_with_content_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
2060
|
-
//
|
|
2061
|
-
|
|
2210
|
+
// Do not merge lists if there are structural separators between them
|
|
2211
|
+
if has_meaningful_content_between(current, next, self.lines) {
|
|
2212
|
+
return false; // Structural separators prevent merging
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
// Only consider merging ordered lists if there's no structural content between
|
|
2216
|
+
current.is_ordered && next.is_ordered
|
|
2062
2217
|
}
|
|
2063
2218
|
|
|
2064
2219
|
/// Check if there are only blank lines between blocks
|
|
@@ -2117,33 +2272,90 @@ fn has_meaningful_content_between(current: &ListBlock, next: &ListBlock, lines:
|
|
|
2117
2272
|
continue;
|
|
2118
2273
|
}
|
|
2119
2274
|
|
|
2275
|
+
// Check for structural separators that should separate lists (CommonMark compliant)
|
|
2276
|
+
|
|
2277
|
+
// Headings separate lists
|
|
2278
|
+
if line_info.heading.is_some() {
|
|
2279
|
+
return true; // Has meaningful content - headings separate lists
|
|
2280
|
+
}
|
|
2281
|
+
|
|
2282
|
+
// Horizontal rules separate lists (---, ***, ___)
|
|
2283
|
+
if is_horizontal_rule(trimmed) {
|
|
2284
|
+
return true; // Has meaningful content - horizontal rules separate lists
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
// Tables separate lists (lines containing |)
|
|
2288
|
+
if trimmed.contains('|') && trimmed.len() > 1 {
|
|
2289
|
+
return true; // Has meaningful content - tables separate lists
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
// Blockquotes separate lists
|
|
2293
|
+
if trimmed.starts_with('>') {
|
|
2294
|
+
return true; // Has meaningful content - blockquotes separate lists
|
|
2295
|
+
}
|
|
2296
|
+
|
|
2297
|
+
// Code block fences separate lists (unless properly indented as list content)
|
|
2298
|
+
if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
|
|
2299
|
+
let line_indent = line_info.content.len() - line_info.content.trim_start().len();
|
|
2300
|
+
|
|
2301
|
+
// Check if this code block is properly indented as list continuation
|
|
2302
|
+
let min_continuation_indent = if current.is_ordered {
|
|
2303
|
+
current.nesting_level + current.max_marker_width
|
|
2304
|
+
} else {
|
|
2305
|
+
current.nesting_level + 2
|
|
2306
|
+
};
|
|
2307
|
+
|
|
2308
|
+
if line_indent < min_continuation_indent {
|
|
2309
|
+
// This is a standalone code block that separates lists
|
|
2310
|
+
return true; // Has meaningful content - standalone code blocks separate lists
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2120
2314
|
// Check if this line has proper indentation for list continuation
|
|
2121
2315
|
let line_indent = line_info.content.len() - line_info.content.trim_start().len();
|
|
2122
2316
|
|
|
2123
|
-
//
|
|
2124
|
-
// For ordered lists, use actual marker width; for unordered, 2 spaces
|
|
2317
|
+
// Calculate minimum indentation needed to be list continuation
|
|
2125
2318
|
let min_indent = if current.is_ordered {
|
|
2126
2319
|
current.nesting_level + current.max_marker_width
|
|
2127
2320
|
} else {
|
|
2128
2321
|
current.nesting_level + 2
|
|
2129
2322
|
};
|
|
2130
2323
|
|
|
2131
|
-
//
|
|
2132
|
-
if line_indent
|
|
2133
|
-
return true;
|
|
2324
|
+
// If the line is not indented enough to be list continuation, it's meaningful content
|
|
2325
|
+
if line_indent < min_indent {
|
|
2326
|
+
return true; // Has meaningful content - content not indented as list continuation
|
|
2134
2327
|
}
|
|
2135
2328
|
|
|
2136
|
-
//
|
|
2137
|
-
|
|
2138
|
-
return true;
|
|
2139
|
-
}
|
|
2140
|
-
|
|
2141
|
-
// Any other non-blank content at this level breaks the sequence
|
|
2142
|
-
return false;
|
|
2329
|
+
// If we reach here, the line is properly indented as list continuation
|
|
2330
|
+
// Continue checking other lines
|
|
2143
2331
|
}
|
|
2144
2332
|
}
|
|
2145
2333
|
|
|
2146
|
-
// Only blank lines
|
|
2334
|
+
// Only blank lines or properly indented list continuation content between blocks
|
|
2335
|
+
false
|
|
2336
|
+
}
|
|
2337
|
+
|
|
2338
|
+
/// Check if a line is a horizontal rule (---, ***, ___)
|
|
2339
|
+
fn is_horizontal_rule(trimmed: &str) -> bool {
|
|
2340
|
+
if trimmed.len() < 3 {
|
|
2341
|
+
return false;
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
// Check for three or more consecutive -, *, or _ characters (with optional spaces)
|
|
2345
|
+
let chars: Vec<char> = trimmed.chars().collect();
|
|
2346
|
+
if let Some(&first_char) = chars.first()
|
|
2347
|
+
&& (first_char == '-' || first_char == '*' || first_char == '_')
|
|
2348
|
+
{
|
|
2349
|
+
let mut count = 0;
|
|
2350
|
+
for &ch in &chars {
|
|
2351
|
+
if ch == first_char {
|
|
2352
|
+
count += 1;
|
|
2353
|
+
} else if ch != ' ' && ch != '\t' {
|
|
2354
|
+
return false; // Non-matching, non-whitespace character
|
|
2355
|
+
}
|
|
2356
|
+
}
|
|
2357
|
+
return count >= 3;
|
|
2358
|
+
}
|
|
2147
2359
|
false
|
|
2148
2360
|
}
|
|
2149
2361
|
|
|
@@ -5,7 +5,7 @@ use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severi
|
|
|
5
5
|
use crate::rule_config_serde::RuleConfig;
|
|
6
6
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
7
7
|
use crate::utils::element_cache::{ElementCache, ListMarkerType};
|
|
8
|
-
use crate::utils::regex_cache::
|
|
8
|
+
use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
|
|
9
9
|
use toml;
|
|
10
10
|
|
|
11
11
|
mod md007_config;
|
|
@@ -69,30 +69,6 @@ impl MD007ULIndent {
|
|
|
69
69
|
}
|
|
70
70
|
(false, None)
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
#[allow(dead_code)]
|
|
74
|
-
fn is_in_code_block(content: &str, line_idx: usize) -> bool {
|
|
75
|
-
// Use centralized code fence pattern
|
|
76
|
-
|
|
77
|
-
let lines: Vec<&str> = content.lines().collect();
|
|
78
|
-
let mut in_code_block = false;
|
|
79
|
-
|
|
80
|
-
for (i, line) in lines.iter().enumerate() {
|
|
81
|
-
if i > line_idx {
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if CODE_FENCE_REGEX.is_match(line.trim_start()) {
|
|
86
|
-
in_code_block = !in_code_block;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if i == line_idx {
|
|
90
|
-
return in_code_block;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
false
|
|
95
|
-
}
|
|
96
72
|
}
|
|
97
73
|
|
|
98
74
|
impl Rule for MD007ULIndent {
|