rumdl 0.0.110__tar.gz → 0.0.111__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.110 → rumdl-0.0.111}/Cargo.lock +1 -1
- {rumdl-0.0.110 → rumdl-0.0.111}/Cargo.toml +1 -1
- {rumdl-0.0.110 → rumdl-0.0.111}/PKG-INFO +1 -1
- {rumdl-0.0.110 → rumdl-0.0.111}/src/lint_context.rs +15 -15
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md031_blanks_around_fences.rs +5 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md058_blanks_around_tables.rs +35 -24
- rumdl-0.0.111/src/utils/kramdown_utils.rs +94 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/mod.rs +1 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md005_test.rs +33 -0
- rumdl-0.0.111/tests/rules/md031_kramdown_test.rs +125 -0
- rumdl-0.0.111/tests/rules/md058_kramdown_test.rs +139 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/mod.rs +2 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/.config/nextest.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/.mise.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/.rumdl.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/.rustfmt.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/CHANGELOG.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/LICENSE +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/MANIFEST.in +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/Makefile +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/README.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/assets/logo.png +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benches/range_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/RULES.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/global-settings.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md001.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md002.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md003.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md004.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md005.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md006.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md007.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md009.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md010.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md011.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md012.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md013.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md014.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md018.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md019.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md020.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md021.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md022.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md023.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md024.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md025.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md026.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md027.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md028.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md029.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md030.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md031.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md032.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md033.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md034.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md035.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md036.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md037.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md038.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md039.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md040.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md041.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md042.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md043.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md044.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md045.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md046.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md047.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md048.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md049.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md050.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md051.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md052.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md053.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md054.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md055.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md056.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md057.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/md058.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/parity_check.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/pyproject.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/python/MANIFEST.in +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/rumdl.toml.example +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/rust-toolchain.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/bin/debug_frontmatter.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/exit_codes.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/inline_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/lib.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/lsp/server.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/lsp/types.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/main.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/output/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/parallel.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/profiling.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/python.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rule.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rule_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/src/vscode.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/common/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/config_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/init_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/lib.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/perf_check.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.111}/tests/vscode_windows_test.rs +0 -0
|
@@ -906,6 +906,19 @@ impl<'a> LintContext<'a> {
|
|
|
906
906
|
let content_lines: Vec<&str> = content.lines().collect();
|
|
907
907
|
let mut lines = Vec::with_capacity(content_lines.len());
|
|
908
908
|
|
|
909
|
+
// Detect front matter boundaries FIRST, before any other parsing
|
|
910
|
+
let mut in_front_matter = false;
|
|
911
|
+
let mut front_matter_end = 0;
|
|
912
|
+
if content_lines.first().map(|l| l.trim()) == Some("---") {
|
|
913
|
+
in_front_matter = true;
|
|
914
|
+
for (idx, line) in content_lines.iter().enumerate().skip(1) {
|
|
915
|
+
if line.trim() == "---" {
|
|
916
|
+
front_matter_end = idx;
|
|
917
|
+
break;
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
909
922
|
for (i, line) in content_lines.iter().enumerate() {
|
|
910
923
|
let byte_offset = line_offsets.get(i).copied().unwrap_or(0);
|
|
911
924
|
let indent = line.len() - line.trim_start().len();
|
|
@@ -933,8 +946,8 @@ impl<'a> LintContext<'a> {
|
|
|
933
946
|
byte_offset >= start && byte_offset < end && (is_multiline || is_fenced || is_indented)
|
|
934
947
|
});
|
|
935
948
|
|
|
936
|
-
// Detect list items
|
|
937
|
-
let list_item = if !in_code_block
|
|
949
|
+
// Detect list items (skip if in frontmatter)
|
|
950
|
+
let list_item = if !(in_code_block || is_blank || in_front_matter && i <= front_matter_end) {
|
|
938
951
|
// Strip blockquote prefix if present for list detection
|
|
939
952
|
let (line_for_list_check, blockquote_prefix_len) = if let Some(caps) = BLOCKQUOTE_REGEX.captures(line) {
|
|
940
953
|
let prefix = caps.get(1).unwrap().as_str();
|
|
@@ -1011,19 +1024,6 @@ impl<'a> LintContext<'a> {
|
|
|
1011
1024
|
});
|
|
1012
1025
|
}
|
|
1013
1026
|
|
|
1014
|
-
// Detect front matter boundaries
|
|
1015
|
-
let mut in_front_matter = false;
|
|
1016
|
-
let mut front_matter_end = 0;
|
|
1017
|
-
if content_lines.first().map(|l| l.trim()) == Some("---") {
|
|
1018
|
-
in_front_matter = true;
|
|
1019
|
-
for (idx, line) in content_lines.iter().enumerate().skip(1) {
|
|
1020
|
-
if line.trim() == "---" {
|
|
1021
|
-
front_matter_end = idx;
|
|
1022
|
-
break;
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
1027
|
// Second pass: detect headings (including Setext which needs look-ahead) and blockquotes
|
|
1028
1028
|
for i in 0..content_lines.len() {
|
|
1029
1029
|
if lines[i].in_code_block {
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
5
5
|
use crate::rule_config_serde::RuleConfig;
|
|
6
6
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
7
|
+
use crate::utils::kramdown_utils::is_kramdown_block_attribute;
|
|
7
8
|
use crate::utils::range_utils::{LineIndex, calculate_line_range};
|
|
8
9
|
use serde::{Deserialize, Serialize};
|
|
9
10
|
|
|
@@ -169,8 +170,10 @@ impl Rule for MD031BlanksAroundFences {
|
|
|
169
170
|
current_fence_marker = None;
|
|
170
171
|
|
|
171
172
|
// Check for blank line after closing fence
|
|
173
|
+
// Allow Kramdown block attributes if configured
|
|
172
174
|
if i + 1 < lines.len()
|
|
173
175
|
&& !Self::is_empty_line(lines[i + 1])
|
|
176
|
+
&& !is_kramdown_block_attribute(lines[i + 1])
|
|
174
177
|
&& self.should_require_blank_line(i, &lines)
|
|
175
178
|
{
|
|
176
179
|
let (start_line, start_col, end_line, end_col) = calculate_line_range(i + 1, lines[i]);
|
|
@@ -277,8 +280,10 @@ impl Rule for MD031BlanksAroundFences {
|
|
|
277
280
|
current_fence_marker = None;
|
|
278
281
|
|
|
279
282
|
// Add blank line after closing fence if needed
|
|
283
|
+
// Don't add if next line is a Kramdown block attribute
|
|
280
284
|
if i + 1 < lines.len()
|
|
281
285
|
&& !Self::is_empty_line(lines[i + 1])
|
|
286
|
+
&& !is_kramdown_block_attribute(lines[i + 1])
|
|
282
287
|
&& self.should_require_blank_line(i, &lines)
|
|
283
288
|
{
|
|
284
289
|
result.push(String::new());
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
|
|
2
2
|
use crate::rule_config_serde::RuleConfig;
|
|
3
|
+
use crate::utils::kramdown_utils::is_kramdown_block_attribute;
|
|
3
4
|
use crate::utils::range_utils::LineIndex;
|
|
4
5
|
use crate::utils::table_utils::TableUtils;
|
|
5
6
|
use serde::{Deserialize, Serialize};
|
|
@@ -149,31 +150,41 @@ impl Rule for MD058BlanksAroundTables {
|
|
|
149
150
|
|
|
150
151
|
// Check for sufficient blank lines after table
|
|
151
152
|
if table_block.end_line < lines.len() - 1 {
|
|
152
|
-
|
|
153
|
-
if
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
format!("Missing {needed} blank lines after table")
|
|
159
|
-
};
|
|
153
|
+
// Check if the next line is a Kramdown block attribute
|
|
154
|
+
let next_line_is_attribute = if table_block.end_line + 1 < lines.len() {
|
|
155
|
+
is_kramdown_block_attribute(lines[table_block.end_line + 1])
|
|
156
|
+
} else {
|
|
157
|
+
false
|
|
158
|
+
};
|
|
160
159
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
),
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
160
|
+
// Skip check if next line is a block attribute
|
|
161
|
+
if !next_line_is_attribute {
|
|
162
|
+
let blank_lines_after = self.count_blank_lines_after(&lines, table_block.end_line);
|
|
163
|
+
if blank_lines_after < self.config.minimum_after {
|
|
164
|
+
let needed = self.config.minimum_after - blank_lines_after;
|
|
165
|
+
let message = if self.config.minimum_after == 1 {
|
|
166
|
+
"Missing blank line after table".to_string()
|
|
167
|
+
} else {
|
|
168
|
+
format!("Missing {needed} blank lines after table")
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
warnings.push(LintWarning {
|
|
172
|
+
rule_name: Some(self.name()),
|
|
173
|
+
message,
|
|
174
|
+
line: table_block.end_line + 1,
|
|
175
|
+
column: lines[table_block.end_line].len() + 1,
|
|
176
|
+
end_line: table_block.end_line + 1,
|
|
177
|
+
end_column: lines[table_block.end_line].len() + 2,
|
|
178
|
+
severity: Severity::Warning,
|
|
179
|
+
fix: Some(Fix {
|
|
180
|
+
range: _line_index.line_col_to_byte_range(
|
|
181
|
+
table_block.end_line + 1,
|
|
182
|
+
lines[table_block.end_line].len() + 1,
|
|
183
|
+
),
|
|
184
|
+
replacement: format!("{}{}", lines[table_block.end_line], "\n".repeat(needed)),
|
|
185
|
+
}),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
177
188
|
}
|
|
178
189
|
}
|
|
179
190
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//! Utilities for handling Kramdown-specific syntax
|
|
2
|
+
//!
|
|
3
|
+
//! Kramdown is a superset of Markdown that adds additional features like
|
|
4
|
+
//! Inline Attribute Lists (IAL) for adding attributes to elements.
|
|
5
|
+
|
|
6
|
+
/// Check if a line is a Kramdown block attribute (IAL - Inline Attribute List)
|
|
7
|
+
///
|
|
8
|
+
/// Kramdown IAL syntax allows adding attributes to block elements:
|
|
9
|
+
/// - `{:.class}` - CSS class
|
|
10
|
+
/// - `{:#id}` - Element ID
|
|
11
|
+
/// - `{:attribute="value"}` - Generic attributes
|
|
12
|
+
/// - `{:.class #id attribute="value"}` - Combinations
|
|
13
|
+
///
|
|
14
|
+
/// # Examples
|
|
15
|
+
///
|
|
16
|
+
/// ```
|
|
17
|
+
/// use rumdl::utils::kramdown_utils::is_kramdown_block_attribute;
|
|
18
|
+
///
|
|
19
|
+
/// assert!(is_kramdown_block_attribute("{:.wrap}"));
|
|
20
|
+
/// assert!(is_kramdown_block_attribute("{:#my-id}"));
|
|
21
|
+
/// assert!(is_kramdown_block_attribute("{:.class #id}"));
|
|
22
|
+
/// assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
|
|
23
|
+
///
|
|
24
|
+
/// assert!(!is_kramdown_block_attribute("{just text}"));
|
|
25
|
+
/// assert!(!is_kramdown_block_attribute("{}"));
|
|
26
|
+
/// assert!(!is_kramdown_block_attribute("{"));
|
|
27
|
+
/// ```
|
|
28
|
+
pub fn is_kramdown_block_attribute(line: &str) -> bool {
|
|
29
|
+
let trimmed = line.trim();
|
|
30
|
+
|
|
31
|
+
// Must start with { and end with }
|
|
32
|
+
if !trimmed.starts_with('{') || !trimmed.ends_with('}') || trimmed.len() < 3 {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Check if it matches Kramdown IAL patterns
|
|
37
|
+
// Valid patterns start with {: or {# or {.
|
|
38
|
+
let second_char = trimmed.chars().nth(1);
|
|
39
|
+
matches!(second_char, Some(':') | Some('#') | Some('.'))
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#[cfg(test)]
|
|
43
|
+
mod tests {
|
|
44
|
+
use super::*;
|
|
45
|
+
|
|
46
|
+
#[test]
|
|
47
|
+
fn test_kramdown_class_attributes() {
|
|
48
|
+
assert!(is_kramdown_block_attribute("{:.wrap}"));
|
|
49
|
+
assert!(is_kramdown_block_attribute("{:.class-name}"));
|
|
50
|
+
assert!(is_kramdown_block_attribute("{:.multiple .classes}"));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#[test]
|
|
54
|
+
fn test_kramdown_id_attributes() {
|
|
55
|
+
assert!(is_kramdown_block_attribute("{:#my-id}"));
|
|
56
|
+
assert!(is_kramdown_block_attribute("{:#section-1}"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#[test]
|
|
60
|
+
fn test_kramdown_generic_attributes() {
|
|
61
|
+
assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
|
|
62
|
+
assert!(is_kramdown_block_attribute("{:data-value=\"123\"}"));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[test]
|
|
66
|
+
fn test_kramdown_combined_attributes() {
|
|
67
|
+
assert!(is_kramdown_block_attribute("{:.class #id}"));
|
|
68
|
+
assert!(is_kramdown_block_attribute("{:#id .class style=\"color: blue\"}"));
|
|
69
|
+
assert!(is_kramdown_block_attribute("{:.wrap #my-code .highlight}"));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
#[test]
|
|
73
|
+
fn test_non_kramdown_braces() {
|
|
74
|
+
assert!(!is_kramdown_block_attribute("{just some text}"));
|
|
75
|
+
assert!(!is_kramdown_block_attribute("{not kramdown}"));
|
|
76
|
+
assert!(!is_kramdown_block_attribute("{ spaces }"));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#[test]
|
|
80
|
+
fn test_edge_cases() {
|
|
81
|
+
assert!(!is_kramdown_block_attribute("{}"));
|
|
82
|
+
assert!(!is_kramdown_block_attribute("{"));
|
|
83
|
+
assert!(!is_kramdown_block_attribute("}"));
|
|
84
|
+
assert!(!is_kramdown_block_attribute(""));
|
|
85
|
+
assert!(!is_kramdown_block_attribute("not braces"));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#[test]
|
|
89
|
+
fn test_whitespace_handling() {
|
|
90
|
+
assert!(is_kramdown_block_attribute(" {:.wrap} "));
|
|
91
|
+
assert!(is_kramdown_block_attribute("\t{:#id}\t"));
|
|
92
|
+
assert!(is_kramdown_block_attribute(" {:.class #id} "));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -32,6 +32,39 @@ fn test_valid_ordered_list() {
|
|
|
32
32
|
assert!(result.is_empty());
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
#[test]
|
|
36
|
+
fn test_frontmatter_yaml_lists_not_detected() {
|
|
37
|
+
// Test for issue #35 - YAML lists in frontmatter should not be detected as Markdown lists
|
|
38
|
+
let rule = MD005ListIndent;
|
|
39
|
+
let content = "\
|
|
40
|
+
---
|
|
41
|
+
layout: post
|
|
42
|
+
title: \"title\"
|
|
43
|
+
creator:
|
|
44
|
+
- 'user1'
|
|
45
|
+
- 'user2'
|
|
46
|
+
creator_num:
|
|
47
|
+
- 1253217
|
|
48
|
+
- 1615089
|
|
49
|
+
tags: [tag1, tag2, tag3]
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
# TITLE
|
|
53
|
+
|
|
54
|
+
## Heading
|
|
55
|
+
|
|
56
|
+
Whatever
|
|
57
|
+
|
|
58
|
+
And a list:
|
|
59
|
+
|
|
60
|
+
- Item1
|
|
61
|
+
- Item2";
|
|
62
|
+
let ctx = LintContext::new(content);
|
|
63
|
+
let result = rule.check(&ctx).unwrap();
|
|
64
|
+
// Should not flag YAML lists in frontmatter
|
|
65
|
+
assert!(result.is_empty(), "MD005 should not check lists in frontmatter");
|
|
66
|
+
}
|
|
67
|
+
|
|
35
68
|
#[test]
|
|
36
69
|
fn test_invalid_unordered_indent() {
|
|
37
70
|
let rule = MD005ListIndent;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
use rumdl::lint_context::LintContext;
|
|
2
|
+
use rumdl::rule::Rule;
|
|
3
|
+
use rumdl::rules::MD031BlanksAroundFences;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_kramdown_block_attributes_auto_detected() {
|
|
7
|
+
// Kramdown attributes should be auto-detected without configuration
|
|
8
|
+
let rule = MD031BlanksAroundFences::default();
|
|
9
|
+
let content = r#"# Title
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
echo hello
|
|
13
|
+
```
|
|
14
|
+
{:.wrap}
|
|
15
|
+
|
|
16
|
+
Some text"#;
|
|
17
|
+
let ctx = LintContext::new(content);
|
|
18
|
+
let result = rule.check(&ctx).unwrap();
|
|
19
|
+
assert!(result.is_empty(), "Should auto-detect Kramdown block attributes");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[test]
|
|
23
|
+
fn test_non_kramdown_braces_still_flagged() {
|
|
24
|
+
// Lines with braces that don't match Kramdown IAL syntax should still be flagged
|
|
25
|
+
let rule = MD031BlanksAroundFences::default();
|
|
26
|
+
let content = r#"# Title
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
echo hello
|
|
30
|
+
```
|
|
31
|
+
{not kramdown}
|
|
32
|
+
|
|
33
|
+
Some text"#;
|
|
34
|
+
let ctx = LintContext::new(content);
|
|
35
|
+
let result = rule.check(&ctx).unwrap();
|
|
36
|
+
assert_eq!(result.len(), 1, "Should flag non-Kramdown brace lines");
|
|
37
|
+
assert!(result[0].message.contains("No blank line after"));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#[test]
|
|
41
|
+
fn test_kramdown_css_class_variants() {
|
|
42
|
+
// Test various Kramdown attribute syntax variations
|
|
43
|
+
let rule = MD031BlanksAroundFences::default();
|
|
44
|
+
|
|
45
|
+
// Class attribute
|
|
46
|
+
let content1 = r#"```bash
|
|
47
|
+
echo hello
|
|
48
|
+
```
|
|
49
|
+
{:.wrap}"#;
|
|
50
|
+
let ctx = LintContext::new(content1);
|
|
51
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
52
|
+
|
|
53
|
+
// ID attribute
|
|
54
|
+
let content2 = r#"```bash
|
|
55
|
+
echo hello
|
|
56
|
+
```
|
|
57
|
+
{:#my-code}"#;
|
|
58
|
+
let ctx = LintContext::new(content2);
|
|
59
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
60
|
+
|
|
61
|
+
// Multiple attributes
|
|
62
|
+
let content3 = r#"```bash
|
|
63
|
+
echo hello
|
|
64
|
+
```
|
|
65
|
+
{:.wrap #my-code .highlight}"#;
|
|
66
|
+
let ctx = LintContext::new(content3);
|
|
67
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#[test]
|
|
71
|
+
fn test_kramdown_no_blank_after_attribute() {
|
|
72
|
+
// Kramdown attributes don't need blank lines after them
|
|
73
|
+
let rule = MD031BlanksAroundFences::default();
|
|
74
|
+
let content = r#"```bash
|
|
75
|
+
echo hello
|
|
76
|
+
```
|
|
77
|
+
{:.wrap}
|
|
78
|
+
Some text immediately after"#;
|
|
79
|
+
let ctx = LintContext::new(content);
|
|
80
|
+
let result = rule.check(&ctx).unwrap();
|
|
81
|
+
// This should not flag since the Kramdown attribute is auto-detected
|
|
82
|
+
assert!(result.is_empty(), "Should auto-detect Kramdown attributes");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[test]
|
|
86
|
+
fn test_normal_code_blocks_still_checked() {
|
|
87
|
+
// Normal code blocks without attributes should still be checked
|
|
88
|
+
let rule = MD031BlanksAroundFences::default();
|
|
89
|
+
let content = r#"# Title
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
echo hello
|
|
93
|
+
```
|
|
94
|
+
Some text immediately after"#;
|
|
95
|
+
let ctx = LintContext::new(content);
|
|
96
|
+
let result = rule.check(&ctx).unwrap();
|
|
97
|
+
assert_eq!(
|
|
98
|
+
result.len(),
|
|
99
|
+
1,
|
|
100
|
+
"Should still flag missing blank line for normal code blocks"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#[test]
|
|
105
|
+
fn test_fix_preserves_kramdown_attributes() {
|
|
106
|
+
let rule = MD031BlanksAroundFences::default();
|
|
107
|
+
let content = r#"Text before
|
|
108
|
+
```bash
|
|
109
|
+
echo hello
|
|
110
|
+
```
|
|
111
|
+
{:.wrap}
|
|
112
|
+
Text after"#;
|
|
113
|
+
let ctx = LintContext::new(content);
|
|
114
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
115
|
+
|
|
116
|
+
// Should add blank line before the code block but not after (due to attribute)
|
|
117
|
+
let expected = r#"Text before
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
echo hello
|
|
121
|
+
```
|
|
122
|
+
{:.wrap}
|
|
123
|
+
Text after"#;
|
|
124
|
+
assert_eq!(fixed, expected);
|
|
125
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
use rumdl::lint_context::LintContext;
|
|
2
|
+
use rumdl::rule::Rule;
|
|
3
|
+
use rumdl::rules::MD058BlanksAroundTables;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_kramdown_block_attributes_auto_detected() {
|
|
7
|
+
// Kramdown attributes should be auto-detected without configuration
|
|
8
|
+
let rule = MD058BlanksAroundTables::default();
|
|
9
|
+
let content = r#"# Title
|
|
10
|
+
|
|
11
|
+
| Header 1 | Header 2 |
|
|
12
|
+
|----------|----------|
|
|
13
|
+
| Cell 1 | Cell 2 |
|
|
14
|
+
{:.striped}
|
|
15
|
+
|
|
16
|
+
Some text"#;
|
|
17
|
+
let ctx = LintContext::new(content);
|
|
18
|
+
let result = rule.check(&ctx).unwrap();
|
|
19
|
+
assert!(result.is_empty(), "Should auto-detect Kramdown block attributes");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[test]
|
|
23
|
+
fn test_non_kramdown_braces_still_flagged() {
|
|
24
|
+
// Lines with braces that don't match Kramdown IAL syntax should still be flagged
|
|
25
|
+
let rule = MD058BlanksAroundTables::default();
|
|
26
|
+
let content = r#"# Title
|
|
27
|
+
|
|
28
|
+
| Header 1 | Header 2 |
|
|
29
|
+
|----------|----------|
|
|
30
|
+
| Cell 1 | Cell 2 |
|
|
31
|
+
{not kramdown}
|
|
32
|
+
|
|
33
|
+
Some text"#;
|
|
34
|
+
let ctx = LintContext::new(content);
|
|
35
|
+
let result = rule.check(&ctx).unwrap();
|
|
36
|
+
assert_eq!(result.len(), 1, "Should flag non-Kramdown brace lines");
|
|
37
|
+
assert!(result[0].message.contains("Missing blank line after"));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#[test]
|
|
41
|
+
fn test_kramdown_table_css_class_variants() {
|
|
42
|
+
// Test various Kramdown attribute syntax variations
|
|
43
|
+
let rule = MD058BlanksAroundTables::default();
|
|
44
|
+
|
|
45
|
+
// Class attribute
|
|
46
|
+
let content1 = r#"Text
|
|
47
|
+
|
|
48
|
+
| Col1 | Col2 |
|
|
49
|
+
|------|------|
|
|
50
|
+
| A | B |
|
|
51
|
+
{:.striped}
|
|
52
|
+
|
|
53
|
+
Text"#;
|
|
54
|
+
let ctx = LintContext::new(content1);
|
|
55
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
56
|
+
|
|
57
|
+
// ID attribute
|
|
58
|
+
let content2 = r#"Text
|
|
59
|
+
|
|
60
|
+
| Col1 | Col2 |
|
|
61
|
+
|------|------|
|
|
62
|
+
| A | B |
|
|
63
|
+
{:#my-table}
|
|
64
|
+
|
|
65
|
+
Text"#;
|
|
66
|
+
let ctx = LintContext::new(content2);
|
|
67
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
68
|
+
|
|
69
|
+
// Multiple attributes
|
|
70
|
+
let content3 = r#"Text
|
|
71
|
+
|
|
72
|
+
| Col1 | Col2 |
|
|
73
|
+
|------|------|
|
|
74
|
+
| A | B |
|
|
75
|
+
{:.striped #my-table .responsive}
|
|
76
|
+
|
|
77
|
+
Text"#;
|
|
78
|
+
let ctx = LintContext::new(content3);
|
|
79
|
+
assert!(rule.check(&ctx).unwrap().is_empty());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
#[test]
|
|
83
|
+
fn test_normal_tables_still_checked() {
|
|
84
|
+
// Normal tables without attributes should still be checked
|
|
85
|
+
let rule = MD058BlanksAroundTables::default();
|
|
86
|
+
let content = r#"# Title
|
|
87
|
+
|
|
88
|
+
| Header 1 | Header 2 |
|
|
89
|
+
|----------|----------|
|
|
90
|
+
| Cell 1 | Cell 2 |
|
|
91
|
+
Some text immediately after"#;
|
|
92
|
+
let ctx = LintContext::new(content);
|
|
93
|
+
let result = rule.check(&ctx).unwrap();
|
|
94
|
+
assert_eq!(
|
|
95
|
+
result.len(),
|
|
96
|
+
1,
|
|
97
|
+
"Should still flag missing blank line for normal tables"
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
#[test]
|
|
102
|
+
fn test_table_before_still_checked() {
|
|
103
|
+
// Should still check for blank lines before table
|
|
104
|
+
let rule = MD058BlanksAroundTables::default();
|
|
105
|
+
let content = r#"# Title
|
|
106
|
+
| Header 1 | Header 2 |
|
|
107
|
+
|----------|----------|
|
|
108
|
+
| Cell 1 | Cell 2 |
|
|
109
|
+
{:.striped}
|
|
110
|
+
|
|
111
|
+
Text"#;
|
|
112
|
+
let ctx = LintContext::new(content);
|
|
113
|
+
let result = rule.check(&ctx).unwrap();
|
|
114
|
+
assert_eq!(result.len(), 1, "Should flag missing blank line before table");
|
|
115
|
+
assert!(result[0].message.contains("Missing blank line before"));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
#[test]
|
|
119
|
+
fn test_fix_preserves_kramdown_attributes() {
|
|
120
|
+
let rule = MD058BlanksAroundTables::default();
|
|
121
|
+
let content = r#"Text before
|
|
122
|
+
| Col1 | Col2 |
|
|
123
|
+
|------|------|
|
|
124
|
+
| A | B |
|
|
125
|
+
{:.striped}
|
|
126
|
+
Text after"#;
|
|
127
|
+
let ctx = LintContext::new(content);
|
|
128
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
129
|
+
|
|
130
|
+
// Should add blank line before the table but not after (due to attribute)
|
|
131
|
+
let expected = r#"Text before
|
|
132
|
+
|
|
133
|
+
| Col1 | Col2 |
|
|
134
|
+
|------|------|
|
|
135
|
+
| A | B |
|
|
136
|
+
{:.striped}
|
|
137
|
+
Text after"#;
|
|
138
|
+
assert_eq!(fixed, expected);
|
|
139
|
+
}
|
|
@@ -25,6 +25,7 @@ mod md027_test;
|
|
|
25
25
|
mod md028_test;
|
|
26
26
|
mod md029_test;
|
|
27
27
|
mod md030_test;
|
|
28
|
+
mod md031_kramdown_test;
|
|
28
29
|
mod md031_test;
|
|
29
30
|
mod md032_test;
|
|
30
31
|
mod md033_test;
|
|
@@ -56,6 +57,7 @@ mod md054_test;
|
|
|
56
57
|
mod md055_test;
|
|
57
58
|
mod md056_test;
|
|
58
59
|
mod md057_test;
|
|
60
|
+
mod md058_kramdown_test;
|
|
59
61
|
mod md058_test;
|
|
60
62
|
|
|
61
63
|
// Unicode-specific test modules
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|