rumdl 0.0.130__tar.gz → 0.0.131__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.130 → rumdl-0.0.131}/CHANGELOG.md +8 -1
- {rumdl-0.0.130 → rumdl-0.0.131}/Cargo.lock +1 -1
- {rumdl-0.0.130 → rumdl-0.0.131}/Cargo.toml +1 -1
- {rumdl-0.0.130 → rumdl-0.0.131}/PKG-INFO +1 -1
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md002_first_heading_h1.rs +183 -90
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md034_no_bare_urls.rs +2 -2
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_snippets.rs +160 -15
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/skip_context.rs +8 -3
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/basic_tests.rs +4 -2
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md002_test.rs +69 -83
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_edge_cases_test.rs +3 -3
- {rumdl-0.0.130 → rumdl-0.0.131}/.config/nextest.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/.mise.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/.rumdl.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/.rustfmt.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/LICENSE +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/MANIFEST.in +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/Makefile +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/README.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/assets/logo.png +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benches/range_performance.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/RULES.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/global-settings.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md001.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md002.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md003.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md004.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md005.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md006.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md007.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md009.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md010.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md011.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md012.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md013.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md014.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md018.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md019.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md020.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md021.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md022.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md023.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md024.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md025.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md026.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md027.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md028.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md029.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md030.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md031.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md032.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md033.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md034.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md035.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md036.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md037.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md038.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md039.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md040.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md041.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md042.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md043.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md044.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md045.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md046.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md047.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md048.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md049.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md050.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md051.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md052.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md053.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md054.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md055.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md056.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md057.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/md058.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/parity_check.py +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/pyproject.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/python/MANIFEST.in +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/rumdl.toml.example +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/rust-toolchain.toml +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/exit_codes.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/inline_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/lib.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/lint_context.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/server.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/types.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/main.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/output/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/parallel.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/performance.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/profiling.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/python.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rule.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rule_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/github.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/jekyll.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/kramdown.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/header_id_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_admonitions.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_common.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_critic.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_footnotes.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_patterns.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_tabs.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_test_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocstrings_refs.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/src/vscode.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_upward_traversal_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/init_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/lib.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/perf_check.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_dynamic_indent_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_code_block_separation_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_fix_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_issue42_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_comprehensive_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_property_based_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_regression_prevention_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_unicode_security_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_admonitions_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_extensions_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_snippets_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/test_underscore_edge_cases.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/unfixable_rules_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.131] - 2025-08-28
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **MD002**: Implemented markdownlint compatibility - MD002 no longer triggers when first heading is on the first line, regardless of level (fixes #65)
|
|
14
|
+
- **MD034**: Added support for multi-line MkDocs snippet blocks where markers appear on separate lines (fixes #70)
|
|
15
|
+
|
|
10
16
|
## [0.0.130] - 2025-08-27
|
|
11
17
|
|
|
12
18
|
### Fixed
|
|
@@ -508,7 +514,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
508
514
|
|
|
509
515
|
- Initial implementation of remaining rules for markdownlint parity
|
|
510
516
|
|
|
511
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
517
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.131...HEAD
|
|
518
|
+
[0.0.131]: https://github.com/rvben/rumdl/compare/v0.0.130...v0.0.131
|
|
512
519
|
[0.0.130]: https://github.com/rvben/rumdl/compare/v0.0.129...v0.0.130
|
|
513
520
|
[0.0.129]: https://github.com/rvben/rumdl/compare/v0.0.128...v0.0.129
|
|
514
521
|
[0.0.128]: https://github.com/rvben/rumdl/compare/v0.0.127...v0.0.128
|
|
@@ -122,53 +122,74 @@ impl Rule for MD002FirstHeadingH1 {
|
|
|
122
122
|
.enumerate()
|
|
123
123
|
.find_map(|(line_num, line_info)| line_info.heading.as_ref().map(|h| (line_num, line_info, h)));
|
|
124
124
|
|
|
125
|
-
if let Some((line_num, line_info, heading)) = first_heading
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
},
|
|
125
|
+
if let Some((line_num, line_info, heading)) = first_heading {
|
|
126
|
+
// Check if the first heading is on the first non-empty line after front matter.
|
|
127
|
+
// If it is AND it's already H1, MD002 should not trigger (already correct).
|
|
128
|
+
// If it is but NOT H1, MD002 still should not trigger for markdownlint compatibility
|
|
129
|
+
// (MD002 is implicitly disabled when MD041 would be satisfied).
|
|
130
|
+
let first_content_line = ctx
|
|
131
|
+
.lines
|
|
132
|
+
.iter()
|
|
133
|
+
.enumerate()
|
|
134
|
+
.find(|(_, line_info)| !line_info.in_front_matter && !line_info.content.trim().is_empty())
|
|
135
|
+
.map(|(idx, _)| idx);
|
|
136
|
+
|
|
137
|
+
// If the first heading is on the first content line, don't trigger MD002
|
|
138
|
+
// This matches markdownlint behavior where MD002 doesn't apply to first-line headings
|
|
139
|
+
if let Some(first_line_idx) = first_content_line
|
|
140
|
+
&& line_num == first_line_idx
|
|
141
|
+
{
|
|
142
|
+
return Ok(vec![]);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Otherwise check if the heading level is correct
|
|
146
|
+
if heading.level != self.config.level as u8 {
|
|
147
|
+
let message = format!(
|
|
148
|
+
"First heading should be level {}, found level {}",
|
|
149
|
+
self.config.level, heading.level
|
|
149
150
|
);
|
|
150
151
|
|
|
151
|
-
//
|
|
152
|
-
let
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
152
|
+
// Calculate the fix
|
|
153
|
+
let fix = {
|
|
154
|
+
let replacement = crate::rules::heading_utils::HeadingUtils::convert_heading_style(
|
|
155
|
+
&heading.text,
|
|
156
|
+
self.config.level,
|
|
157
|
+
match heading.style {
|
|
158
|
+
crate::lint_context::HeadingStyle::ATX => {
|
|
159
|
+
if heading.has_closing_sequence {
|
|
160
|
+
HeadingStyle::AtxClosed
|
|
161
|
+
} else {
|
|
162
|
+
HeadingStyle::Atx
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
crate::lint_context::HeadingStyle::Setext1 => HeadingStyle::Setext1,
|
|
166
|
+
crate::lint_context::HeadingStyle::Setext2 => HeadingStyle::Setext2,
|
|
167
|
+
},
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
// Use line content range to replace the entire heading line
|
|
171
|
+
let line_index = crate::utils::range_utils::LineIndex::new(content.to_string());
|
|
172
|
+
Some(Fix {
|
|
173
|
+
range: line_index.line_content_range(line_num + 1), // Convert to 1-indexed
|
|
174
|
+
replacement,
|
|
175
|
+
})
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// Calculate precise range: highlight the entire first heading
|
|
179
|
+
let (start_line, start_col, end_line, end_col) =
|
|
180
|
+
calculate_heading_range(line_num + 1, &line_info.content);
|
|
181
|
+
|
|
182
|
+
return Ok(vec![LintWarning {
|
|
183
|
+
message,
|
|
184
|
+
line: start_line,
|
|
185
|
+
column: start_col,
|
|
186
|
+
end_line,
|
|
187
|
+
end_column: end_col,
|
|
188
|
+
severity: Severity::Warning,
|
|
189
|
+
fix,
|
|
190
|
+
rule_name: Some(self.name()),
|
|
191
|
+
}]);
|
|
192
|
+
}
|
|
172
193
|
}
|
|
173
194
|
|
|
174
195
|
Ok(vec![])
|
|
@@ -185,6 +206,22 @@ impl Rule for MD002FirstHeadingH1 {
|
|
|
185
206
|
.find_map(|(line_num, line_info)| line_info.heading.as_ref().map(|h| (line_num, line_info, h)));
|
|
186
207
|
|
|
187
208
|
if let Some((line_num, line_info, heading)) = first_heading {
|
|
209
|
+
// Check if the first heading is on the first non-empty line after front matter.
|
|
210
|
+
// If it is, MD002 should not apply (markdownlint compatibility).
|
|
211
|
+
let first_content_line = ctx
|
|
212
|
+
.lines
|
|
213
|
+
.iter()
|
|
214
|
+
.enumerate()
|
|
215
|
+
.find(|(_, line_info)| !line_info.in_front_matter && !line_info.content.trim().is_empty())
|
|
216
|
+
.map(|(idx, _)| idx);
|
|
217
|
+
|
|
218
|
+
if let Some(first_line_idx) = first_content_line
|
|
219
|
+
&& line_num == first_line_idx
|
|
220
|
+
{
|
|
221
|
+
return Ok(content.to_string());
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// If we're here, the heading is not on the first line, so check if it needs fixing
|
|
188
225
|
if heading.level == self.config.level as u8 {
|
|
189
226
|
return Ok(content.to_string());
|
|
190
227
|
}
|
|
@@ -310,18 +347,13 @@ mod tests {
|
|
|
310
347
|
|
|
311
348
|
#[test]
|
|
312
349
|
fn test_incorrect_h2_first_heading() {
|
|
350
|
+
// When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
|
|
313
351
|
let rule = MD002FirstHeadingH1::new(1);
|
|
314
352
|
let content = "## Introduction\n\nContent here\n\n# Main Title";
|
|
315
353
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
316
354
|
let result = rule.check(&ctx).unwrap();
|
|
317
355
|
|
|
318
|
-
assert_eq!(result.len(),
|
|
319
|
-
assert!(
|
|
320
|
-
result[0]
|
|
321
|
-
.message
|
|
322
|
-
.contains("First heading should be level 1, found level 2")
|
|
323
|
-
);
|
|
324
|
-
assert_eq!(result[0].line, 1);
|
|
356
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
|
|
325
357
|
}
|
|
326
358
|
|
|
327
359
|
#[test]
|
|
@@ -345,17 +377,13 @@ mod tests {
|
|
|
345
377
|
|
|
346
378
|
#[test]
|
|
347
379
|
fn test_setext_style_heading() {
|
|
380
|
+
// When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
|
|
348
381
|
let rule = MD002FirstHeadingH1::new(1);
|
|
349
382
|
let content = "Introduction\n------------\n\nContent here";
|
|
350
383
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
351
384
|
let result = rule.check(&ctx).unwrap();
|
|
352
385
|
|
|
353
|
-
assert_eq!(result.len(),
|
|
354
|
-
assert!(
|
|
355
|
-
result[0]
|
|
356
|
-
.message
|
|
357
|
-
.contains("First heading should be level 1, found level 2")
|
|
358
|
-
);
|
|
386
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
|
|
359
387
|
}
|
|
360
388
|
|
|
361
389
|
#[test]
|
|
@@ -370,99 +398,90 @@ mod tests {
|
|
|
370
398
|
|
|
371
399
|
#[test]
|
|
372
400
|
fn test_with_front_matter() {
|
|
401
|
+
// When heading is immediately after front matter, MD002 doesn't trigger (markdownlint compatibility)
|
|
373
402
|
let rule = MD002FirstHeadingH1::new(1);
|
|
374
|
-
let content = "---\ntitle: Test Document\nauthor: Test Author\n---\n
|
|
403
|
+
let content = "---\ntitle: Test Document\nauthor: Test Author\n---\n## Introduction\n\nContent";
|
|
375
404
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
376
405
|
let result = rule.check(&ctx).unwrap();
|
|
377
406
|
|
|
378
|
-
assert_eq!(result.len(),
|
|
379
|
-
assert!(
|
|
380
|
-
result[0]
|
|
381
|
-
.message
|
|
382
|
-
.contains("First heading should be level 1, found level 2")
|
|
383
|
-
);
|
|
407
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings after front matter
|
|
384
408
|
}
|
|
385
409
|
|
|
386
410
|
#[test]
|
|
387
411
|
fn test_fix_atx_heading() {
|
|
412
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
388
413
|
let rule = MD002FirstHeadingH1::new(1);
|
|
389
414
|
let content = "## Introduction\n\nContent here";
|
|
390
415
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
391
416
|
|
|
392
417
|
let fixed = rule.fix(&ctx).unwrap();
|
|
393
|
-
assert_eq!(fixed,
|
|
418
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
394
419
|
}
|
|
395
420
|
|
|
396
421
|
#[test]
|
|
397
422
|
fn test_fix_closed_atx_heading() {
|
|
423
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
398
424
|
let rule = MD002FirstHeadingH1::new(1);
|
|
399
425
|
let content = "## Introduction ##\n\nContent here";
|
|
400
426
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
401
427
|
|
|
402
428
|
let fixed = rule.fix(&ctx).unwrap();
|
|
403
|
-
assert_eq!(fixed,
|
|
429
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
404
430
|
}
|
|
405
431
|
|
|
406
432
|
#[test]
|
|
407
433
|
fn test_fix_setext_heading() {
|
|
434
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
408
435
|
let rule = MD002FirstHeadingH1::new(1);
|
|
409
436
|
let content = "Introduction\n------------\n\nContent here";
|
|
410
437
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
411
438
|
|
|
412
439
|
let fixed = rule.fix(&ctx).unwrap();
|
|
413
|
-
assert_eq!(fixed,
|
|
440
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
414
441
|
}
|
|
415
442
|
|
|
416
443
|
#[test]
|
|
417
444
|
fn test_fix_with_indented_heading() {
|
|
445
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
418
446
|
let rule = MD002FirstHeadingH1::new(1);
|
|
419
447
|
let content = " ## Introduction\n\nContent here";
|
|
420
448
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
421
449
|
|
|
422
450
|
let fixed = rule.fix(&ctx).unwrap();
|
|
423
|
-
assert_eq!(fixed,
|
|
451
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
424
452
|
}
|
|
425
453
|
|
|
426
454
|
#[test]
|
|
427
455
|
fn test_custom_level_requirement() {
|
|
456
|
+
// When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
|
|
428
457
|
let rule = MD002FirstHeadingH1::new(2);
|
|
429
458
|
let content = "# Main Title\n\n## Subsection";
|
|
430
459
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
431
460
|
let result = rule.check(&ctx).unwrap();
|
|
432
461
|
|
|
433
|
-
assert_eq!(result.len(),
|
|
434
|
-
assert!(
|
|
435
|
-
result[0]
|
|
436
|
-
.message
|
|
437
|
-
.contains("First heading should be level 2, found level 1")
|
|
438
|
-
);
|
|
462
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
|
|
439
463
|
}
|
|
440
464
|
|
|
441
465
|
#[test]
|
|
442
466
|
fn test_fix_to_custom_level() {
|
|
467
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
443
468
|
let rule = MD002FirstHeadingH1::new(2);
|
|
444
469
|
let content = "# Main Title\n\nContent";
|
|
445
470
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
446
471
|
|
|
447
472
|
let fixed = rule.fix(&ctx).unwrap();
|
|
448
|
-
assert_eq!(fixed,
|
|
473
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
449
474
|
}
|
|
450
475
|
|
|
451
476
|
#[test]
|
|
452
477
|
fn test_multiple_headings() {
|
|
478
|
+
// When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
|
|
453
479
|
let rule = MD002FirstHeadingH1::new(1);
|
|
454
480
|
let content = "### Introduction\n\n# Main Title\n\n## Section\n\n#### Subsection";
|
|
455
481
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
456
482
|
let result = rule.check(&ctx).unwrap();
|
|
457
483
|
|
|
458
|
-
//
|
|
459
|
-
assert_eq!(result.len(), 1);
|
|
460
|
-
assert!(
|
|
461
|
-
result[0]
|
|
462
|
-
.message
|
|
463
|
-
.contains("First heading should be level 1, found level 3")
|
|
464
|
-
);
|
|
465
|
-
assert_eq!(result[0].line, 1);
|
|
484
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
|
|
466
485
|
}
|
|
467
486
|
|
|
468
487
|
#[test]
|
|
@@ -506,23 +525,24 @@ mod tests {
|
|
|
506
525
|
|
|
507
526
|
#[test]
|
|
508
527
|
fn test_fix_preserves_content_structure() {
|
|
528
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
509
529
|
let rule = MD002FirstHeadingH1::new(1);
|
|
510
530
|
let content = "### Heading\n\nParagraph 1\n\n## Section\n\nParagraph 2";
|
|
511
531
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
512
532
|
|
|
513
533
|
let fixed = rule.fix(&ctx).unwrap();
|
|
514
|
-
assert_eq!(fixed,
|
|
534
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
515
535
|
}
|
|
516
536
|
|
|
517
537
|
#[test]
|
|
518
538
|
fn test_long_setext_underline() {
|
|
539
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
519
540
|
let rule = MD002FirstHeadingH1::new(1);
|
|
520
541
|
let content = "Short Title\n----------------------------------------\n\nContent";
|
|
521
542
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
522
543
|
|
|
523
544
|
let fixed = rule.fix(&ctx).unwrap();
|
|
524
|
-
//
|
|
525
|
-
assert!(fixed.starts_with("Short Title\n======="));
|
|
545
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
526
546
|
}
|
|
527
547
|
|
|
528
548
|
#[test]
|
|
@@ -537,24 +557,97 @@ mod tests {
|
|
|
537
557
|
|
|
538
558
|
#[test]
|
|
539
559
|
fn test_heading_with_special_characters() {
|
|
560
|
+
// When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
|
|
540
561
|
let rule = MD002FirstHeadingH1::new(1);
|
|
541
562
|
let content = "## Heading with **bold** and _italic_ text\n\nContent";
|
|
542
563
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
543
564
|
let result = rule.check(&ctx).unwrap();
|
|
544
565
|
|
|
545
|
-
assert_eq!(result.len(),
|
|
566
|
+
assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
|
|
546
567
|
|
|
547
568
|
let fixed = rule.fix(&ctx).unwrap();
|
|
548
|
-
assert_eq!(fixed,
|
|
569
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
549
570
|
}
|
|
550
571
|
|
|
551
572
|
#[test]
|
|
552
573
|
fn test_atx_heading_with_extra_spaces() {
|
|
574
|
+
// When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
|
|
553
575
|
let rule = MD002FirstHeadingH1::new(1);
|
|
554
576
|
let content = "## Introduction \n\nContent";
|
|
555
577
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
556
578
|
|
|
557
579
|
let fixed = rule.fix(&ctx).unwrap();
|
|
558
|
-
assert_eq!(fixed,
|
|
580
|
+
assert_eq!(fixed, content); // No fix applied for first-line headings
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
#[test]
|
|
584
|
+
fn test_md002_does_not_trigger_when_first_line_is_heading() {
|
|
585
|
+
// This tests markdownlint compatibility: MD002 should not trigger
|
|
586
|
+
// when the first line is a heading (even if it's not level 1)
|
|
587
|
+
// because MD041 would handle this case
|
|
588
|
+
let rule = MD002FirstHeadingH1::new(1);
|
|
589
|
+
let content = "## Introduction\n\nContent here";
|
|
590
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
591
|
+
let result = rule.check(&ctx).unwrap();
|
|
592
|
+
|
|
593
|
+
// MD002 should NOT trigger because the heading is on the first line
|
|
594
|
+
assert_eq!(result.len(), 0, "MD002 should not trigger when first line is a heading");
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
#[test]
|
|
598
|
+
fn test_md002_triggers_when_heading_is_not_first_line() {
|
|
599
|
+
// MD002 should still trigger when the heading is NOT on the first line
|
|
600
|
+
let rule = MD002FirstHeadingH1::new(1);
|
|
601
|
+
let content = "Some text before heading\n\n## Introduction\n\nContent";
|
|
602
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
603
|
+
let result = rule.check(&ctx).unwrap();
|
|
604
|
+
|
|
605
|
+
assert_eq!(
|
|
606
|
+
result.len(),
|
|
607
|
+
1,
|
|
608
|
+
"MD002 should trigger when heading is not on first line"
|
|
609
|
+
);
|
|
610
|
+
assert!(result[0].message.contains("First heading should be level 1"));
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
#[test]
|
|
614
|
+
fn test_md002_with_front_matter_and_first_line_heading() {
|
|
615
|
+
// MD002 should not trigger when the first line after front matter is a heading
|
|
616
|
+
let rule = MD002FirstHeadingH1::new(1);
|
|
617
|
+
let content = "---\ntitle: Test\n---\n## Introduction\n\nContent";
|
|
618
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
619
|
+
let result = rule.check(&ctx).unwrap();
|
|
620
|
+
|
|
621
|
+
assert_eq!(
|
|
622
|
+
result.len(),
|
|
623
|
+
0,
|
|
624
|
+
"MD002 should not trigger when first line after front matter is a heading"
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
#[test]
|
|
629
|
+
fn test_md002_with_front_matter_and_delayed_heading() {
|
|
630
|
+
// MD002 should trigger when the heading is not immediately after front matter
|
|
631
|
+
let rule = MD002FirstHeadingH1::new(1);
|
|
632
|
+
let content = "---\ntitle: Test\n---\nSome text\n\n## Introduction\n\nContent";
|
|
633
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
634
|
+
let result = rule.check(&ctx).unwrap();
|
|
635
|
+
|
|
636
|
+
assert_eq!(
|
|
637
|
+
result.len(),
|
|
638
|
+
1,
|
|
639
|
+
"MD002 should trigger when heading is not immediately after front matter"
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
#[test]
|
|
644
|
+
fn test_md002_fix_does_not_change_first_line_heading() {
|
|
645
|
+
// Fix should not change a heading that's on the first line
|
|
646
|
+
let rule = MD002FirstHeadingH1::new(1);
|
|
647
|
+
let content = "### Third Level Heading\n\nContent";
|
|
648
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
649
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
650
|
+
|
|
651
|
+
assert_eq!(fixed, content, "Fix should not change heading on first line");
|
|
559
652
|
}
|
|
560
653
|
}
|
|
@@ -270,8 +270,8 @@ impl MD034NoBareUrls {
|
|
|
270
270
|
continue;
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
-
// Skip if this is within
|
|
274
|
-
if ctx
|
|
273
|
+
// Skip if this is within any skip context (code blocks, MkDocs snippets, etc.)
|
|
274
|
+
if crate::utils::skip_context::is_in_skip_context(ctx, match_start) {
|
|
275
275
|
continue;
|
|
276
276
|
}
|
|
277
277
|
|