rumdl 0.0.110__tar.gz → 0.0.112__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.112}/CHANGELOG.md +4 -1
- {rumdl-0.0.110 → rumdl-0.0.112}/Cargo.lock +1 -1
- {rumdl-0.0.110 → rumdl-0.0.112}/Cargo.toml +3 -1
- {rumdl-0.0.110 → rumdl-0.0.112}/PKG-INFO +1 -1
- rumdl-0.0.112/scripts/generate-downloads-table.sh +70 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/lint_context.rs +15 -15
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation.rs +50 -6
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md031_blanks_around_fences.rs +5 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md033_no_inline_html.rs +62 -4
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md037_spaces_around_emphasis.rs +11 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md058_blanks_around_tables.rs +35 -24
- rumdl-0.0.112/src/utils/kramdown_utils.rs +252 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/mod.rs +1 -0
- rumdl-0.0.112/tests/kramdown_integration_test.rs +365 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md005_test.rs +33 -0
- rumdl-0.0.112/tests/rules/md026_kramdown_test.rs +105 -0
- rumdl-0.0.112/tests/rules/md031_kramdown_test.rs +125 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md033_extended_test.rs +44 -44
- rumdl-0.0.112/tests/rules/md033_kramdown_test.rs +140 -0
- rumdl-0.0.112/tests/rules/md037_kramdown_test.rs +94 -0
- rumdl-0.0.112/tests/rules/md058_kramdown_test.rs +139 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/mod.rs +6 -0
- rumdl-0.0.110/src/bin/debug_frontmatter.rs +0 -42
- {rumdl-0.0.110 → rumdl-0.0.112}/.config/nextest.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/.mise.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/.rumdl.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/.rustfmt.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/LICENSE +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/MANIFEST.in +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/Makefile +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/README.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/assets/logo.png +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benches/range_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/RULES.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/global-settings.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md001.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md002.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md003.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md004.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md005.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md006.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md007.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md009.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md010.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md011.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md012.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md013.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md014.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md018.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md019.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md020.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md021.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md022.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md023.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md024.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md025.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md026.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md027.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md028.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md029.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md030.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md031.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md032.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md033.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md034.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md035.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md036.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md037.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md038.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md039.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md040.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md041.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md042.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md043.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md044.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md045.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md046.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md047.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md048.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md049.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md050.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md051.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md052.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md053.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md054.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md055.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md056.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md057.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/md058.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/parity_check.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/pyproject.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/python/MANIFEST.in +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/rumdl.toml.example +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/rust-toolchain.toml +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/exit_codes.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/inline_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/lib.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/server.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/types.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/main.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/output/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/parallel.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/performance.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/profiling.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/python.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rule.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rule_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/src/vscode.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/init_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/lib.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/perf_check.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.112] - 2025-08-08
|
|
11
|
+
|
|
10
12
|
## [0.0.110] - 2025-08-08
|
|
11
13
|
|
|
12
14
|
## [0.0.110] - 2025-08-08
|
|
@@ -302,7 +304,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
302
304
|
|
|
303
305
|
- Initial implementation of remaining rules for markdownlint parity
|
|
304
306
|
|
|
305
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
307
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.112...HEAD
|
|
308
|
+
[0.0.112]: https://github.com/rvben/rumdl/compare/v0.0.111...v0.0.112
|
|
306
309
|
[0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
|
|
307
310
|
[0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
|
|
308
311
|
[0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.112"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
rust-version = "1.88.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
@@ -13,6 +13,8 @@ readme = "README.md"
|
|
|
13
13
|
keywords = ["markdown", "linter", "markdown-linter", "static-analysis", "documentation"]
|
|
14
14
|
categories = ["command-line-utilities", "development-tools", "text-processing"]
|
|
15
15
|
exclude = [".github/", ".gitignore", "*.bak"]
|
|
16
|
+
autobins = false # Prevent automatic binary discovery in src/bin/
|
|
17
|
+
default-run = "rumdl" # Default binary for cargo run
|
|
16
18
|
|
|
17
19
|
[lib]
|
|
18
20
|
name = "rumdl"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Generate a markdown table for release downloads
|
|
3
|
+
|
|
4
|
+
VERSION="${1:-}"
|
|
5
|
+
if [ -z "$VERSION" ]; then
|
|
6
|
+
echo "Usage: $0 <version>"
|
|
7
|
+
echo "Example: $0 v0.0.111"
|
|
8
|
+
exit 1
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
# Start the markdown table
|
|
12
|
+
cat << 'EOF'
|
|
13
|
+
## Downloads
|
|
14
|
+
|
|
15
|
+
| File | Platform | Checksum |
|
|
16
|
+
|------|----------|----------|
|
|
17
|
+
EOF
|
|
18
|
+
|
|
19
|
+
# Generate table rows for each platform
|
|
20
|
+
generate_row() {
|
|
21
|
+
local target="$1"
|
|
22
|
+
local platform="$2"
|
|
23
|
+
|
|
24
|
+
# Determine file extension based on platform
|
|
25
|
+
if [[ "$target" == *"windows"* ]]; then
|
|
26
|
+
ext="zip"
|
|
27
|
+
else
|
|
28
|
+
ext="tar.gz"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
filename="rumdl-${VERSION}-${target}.${ext}"
|
|
32
|
+
checksum_file="${filename}.sha256"
|
|
33
|
+
|
|
34
|
+
# Generate download URLs
|
|
35
|
+
download_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${filename}"
|
|
36
|
+
checksum_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${checksum_file}"
|
|
37
|
+
|
|
38
|
+
# Output table row
|
|
39
|
+
echo "| [${filename}](${download_url}) | ${platform} | [checksum](${checksum_url}) |"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Generate rows for each platform
|
|
43
|
+
generate_row "x86_64-unknown-linux-gnu" "Linux x86_64"
|
|
44
|
+
generate_row "x86_64-unknown-linux-musl" "Linux x86_64 (musl)"
|
|
45
|
+
generate_row "aarch64-unknown-linux-gnu" "Linux ARM64"
|
|
46
|
+
generate_row "aarch64-unknown-linux-musl" "Linux ARM64 (musl)"
|
|
47
|
+
generate_row "x86_64-apple-darwin" "macOS x86_64"
|
|
48
|
+
generate_row "aarch64-apple-darwin" "macOS ARM64 (Apple Silicon)"
|
|
49
|
+
generate_row "x86_64-pc-windows-msvc" "Windows x86_64"
|
|
50
|
+
|
|
51
|
+
echo ""
|
|
52
|
+
echo "## Installation"
|
|
53
|
+
echo ""
|
|
54
|
+
echo "### Using uv (Recommended)"
|
|
55
|
+
echo '```bash'
|
|
56
|
+
echo 'uv tool install rumdl'
|
|
57
|
+
echo '```'
|
|
58
|
+
echo ""
|
|
59
|
+
echo "### Using pip"
|
|
60
|
+
echo '```bash'
|
|
61
|
+
echo 'pip install rumdl'
|
|
62
|
+
echo '```'
|
|
63
|
+
echo ""
|
|
64
|
+
echo "### Using pipx"
|
|
65
|
+
echo '```bash'
|
|
66
|
+
echo 'pipx install rumdl'
|
|
67
|
+
echo '```'
|
|
68
|
+
echo ""
|
|
69
|
+
echo "### Direct Download"
|
|
70
|
+
echo "Download the appropriate binary for your platform from the table above, extract it, and add it to your PATH."
|
|
@@ -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 {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
///
|
|
3
3
|
/// See [docs/md026.md](../../docs/md026.md) for full documentation, configuration, and examples.
|
|
4
4
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
|
|
5
|
+
use crate::utils::kramdown_utils::has_header_id;
|
|
5
6
|
use crate::utils::range_utils::calculate_match_range;
|
|
6
7
|
use lazy_static::lazy_static;
|
|
7
8
|
use regex::Regex;
|
|
@@ -195,6 +196,16 @@ impl MD026NoTrailingPunctuation {
|
|
|
195
196
|
let space = captures.get(3).unwrap().as_str();
|
|
196
197
|
let content = captures.get(4).unwrap().as_str();
|
|
197
198
|
|
|
199
|
+
// If content has a valid Kramdown header ID, don't fix it
|
|
200
|
+
if has_header_id(content) {
|
|
201
|
+
// Return the line unchanged
|
|
202
|
+
if let Some(trailing) = captures.get(5) {
|
|
203
|
+
return format!("{}{}{}{}{}", indentation, hashes, space, content, trailing.as_str());
|
|
204
|
+
}
|
|
205
|
+
return format!("{indentation}{hashes}{space}{content}");
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Otherwise, remove trailing punctuation
|
|
198
209
|
let fixed_content = self.remove_trailing_punctuation(content, re);
|
|
199
210
|
|
|
200
211
|
// Preserve any trailing hashes if present
|
|
@@ -297,10 +308,26 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
297
308
|
continue;
|
|
298
309
|
}
|
|
299
310
|
|
|
300
|
-
//
|
|
301
|
-
if
|
|
311
|
+
// For headers with potential Kramdown syntax, we need to be more careful
|
|
312
|
+
let text_to_check = if has_header_id(&heading.text) {
|
|
313
|
+
// Valid Kramdown ID - skip this header entirely
|
|
314
|
+
continue;
|
|
315
|
+
} else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
|
|
316
|
+
// Has curly braces but not a valid Kramdown ID
|
|
317
|
+
// Check for punctuation before the opening brace
|
|
318
|
+
if let Some(brace_pos) = heading.text.rfind('{') {
|
|
319
|
+
heading.text[..brace_pos].trim().to_string()
|
|
320
|
+
} else {
|
|
321
|
+
heading.text.clone()
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
// Regular header without Kramdown syntax
|
|
325
|
+
heading.text.clone()
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
if self.has_trailing_punctuation(&text_to_check, &re) {
|
|
302
329
|
// Find the trailing punctuation
|
|
303
|
-
if let Some(punctuation_match) = re.find(&
|
|
330
|
+
if let Some(punctuation_match) = re.find(&text_to_check) {
|
|
304
331
|
let line = &line_info.content;
|
|
305
332
|
|
|
306
333
|
// For ATX headings, find the punctuation position in the line
|
|
@@ -316,14 +343,14 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
316
343
|
punctuation_len,
|
|
317
344
|
);
|
|
318
345
|
|
|
319
|
-
let last_char =
|
|
346
|
+
let last_char = text_to_check.chars().last().unwrap_or(' ');
|
|
320
347
|
warnings.push(LintWarning {
|
|
321
348
|
rule_name: Some(self.name()),
|
|
322
349
|
line: start_line,
|
|
323
350
|
column: start_col,
|
|
324
351
|
end_line,
|
|
325
352
|
end_column: end_col,
|
|
326
|
-
message: format!("Heading '{}' ends with punctuation '{}'"
|
|
353
|
+
message: format!("Heading '{text_to_check}' ends with punctuation '{last_char}'"),
|
|
327
354
|
severity: Severity::Warning,
|
|
328
355
|
fix: Some(Fix {
|
|
329
356
|
range: self.get_line_byte_range(content, line_num + 1),
|
|
@@ -386,8 +413,25 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
386
413
|
continue;
|
|
387
414
|
}
|
|
388
415
|
|
|
416
|
+
// Handle headers with potential Kramdown syntax
|
|
417
|
+
let text_to_check = if has_header_id(&heading.text) {
|
|
418
|
+
// Valid Kramdown ID - skip this header entirely
|
|
419
|
+
continue;
|
|
420
|
+
} else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
|
|
421
|
+
// Has curly braces but not a valid Kramdown ID
|
|
422
|
+
// Check for punctuation before the opening brace
|
|
423
|
+
if let Some(brace_pos) = heading.text.rfind('{') {
|
|
424
|
+
heading.text[..brace_pos].trim().to_string()
|
|
425
|
+
} else {
|
|
426
|
+
heading.text.clone()
|
|
427
|
+
}
|
|
428
|
+
} else {
|
|
429
|
+
// Regular header without Kramdown syntax
|
|
430
|
+
heading.text.clone()
|
|
431
|
+
};
|
|
432
|
+
|
|
389
433
|
// Check and fix trailing punctuation
|
|
390
|
-
if self.has_trailing_punctuation(&
|
|
434
|
+
if self.has_trailing_punctuation(&text_to_check, &re) {
|
|
391
435
|
fixed_lines[line_num] = if matches!(heading.style, crate::lint_context::HeadingStyle::ATX) {
|
|
392
436
|
self.fix_atx_heading(&line_info.content, &re)
|
|
393
437
|
} else {
|
|
@@ -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());
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
7
7
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
8
|
+
use crate::utils::kramdown_utils::{is_kramdown_block_attribute, is_kramdown_extension};
|
|
8
9
|
use crate::utils::range_utils::calculate_html_tag_range;
|
|
9
10
|
use crate::utils::regex_cache::*;
|
|
10
11
|
use lazy_static::lazy_static;
|
|
@@ -157,7 +158,13 @@ impl MD033NoInlineHtml {
|
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
/// Find HTML tags that span multiple lines
|
|
160
|
-
fn find_multiline_html_tags(
|
|
161
|
+
fn find_multiline_html_tags(
|
|
162
|
+
&self,
|
|
163
|
+
content: &str,
|
|
164
|
+
structure: &DocumentStructure,
|
|
165
|
+
nomarkdown_ranges: &[(usize, usize)],
|
|
166
|
+
warnings: &mut Vec<LintWarning>,
|
|
167
|
+
) {
|
|
161
168
|
// Early return: if content has no incomplete tags at line ends, skip processing
|
|
162
169
|
if !content.contains('<') || !content.lines().any(|line| line.trim_end().ends_with('<')) {
|
|
163
170
|
return;
|
|
@@ -178,6 +185,14 @@ impl MD033NoInlineHtml {
|
|
|
178
185
|
continue;
|
|
179
186
|
}
|
|
180
187
|
|
|
188
|
+
// Skip lines inside nomarkdown blocks
|
|
189
|
+
if nomarkdown_ranges
|
|
190
|
+
.iter()
|
|
191
|
+
.any(|(start, end)| line_num >= *start && line_num <= *end)
|
|
192
|
+
{
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
|
|
181
196
|
// Early return: skip lines that don't end with incomplete tags
|
|
182
197
|
if !line.contains('<') {
|
|
183
198
|
continue;
|
|
@@ -288,7 +303,37 @@ impl Rule for MD033NoInlineHtml {
|
|
|
288
303
|
let mut warnings = Vec::new();
|
|
289
304
|
let lines: Vec<&str> = content.lines().collect();
|
|
290
305
|
|
|
291
|
-
//
|
|
306
|
+
// Track nomarkdown and comment blocks
|
|
307
|
+
let mut in_nomarkdown = false;
|
|
308
|
+
let mut in_comment = false;
|
|
309
|
+
let mut nomarkdown_ranges: Vec<(usize, usize)> = Vec::new();
|
|
310
|
+
let mut nomarkdown_start = 0;
|
|
311
|
+
let mut comment_start = 0;
|
|
312
|
+
|
|
313
|
+
// First pass: identify nomarkdown and comment blocks
|
|
314
|
+
for (i, line) in lines.iter().enumerate() {
|
|
315
|
+
let line_num = i + 1;
|
|
316
|
+
|
|
317
|
+
// Check for nomarkdown start
|
|
318
|
+
if line.trim() == "{::nomarkdown}" {
|
|
319
|
+
in_nomarkdown = true;
|
|
320
|
+
nomarkdown_start = line_num;
|
|
321
|
+
} else if line.trim() == "{:/nomarkdown}" && in_nomarkdown {
|
|
322
|
+
in_nomarkdown = false;
|
|
323
|
+
nomarkdown_ranges.push((nomarkdown_start, line_num));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Check for comment blocks
|
|
327
|
+
if line.trim() == "{::comment}" {
|
|
328
|
+
in_comment = true;
|
|
329
|
+
comment_start = line_num;
|
|
330
|
+
} else if line.trim() == "{:/comment}" && in_comment {
|
|
331
|
+
in_comment = false;
|
|
332
|
+
nomarkdown_ranges.push((comment_start, line_num));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Second pass: find single-line HTML tags
|
|
292
337
|
// To match markdownlint behavior, report one warning per HTML tag
|
|
293
338
|
for (i, line) in lines.iter().enumerate() {
|
|
294
339
|
let line_num = i + 1;
|
|
@@ -305,6 +350,19 @@ impl Rule for MD033NoInlineHtml {
|
|
|
305
350
|
continue;
|
|
306
351
|
}
|
|
307
352
|
|
|
353
|
+
// Skip lines inside nomarkdown blocks
|
|
354
|
+
if nomarkdown_ranges
|
|
355
|
+
.iter()
|
|
356
|
+
.any(|(start, end)| line_num >= *start && line_num <= *end)
|
|
357
|
+
{
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Skip Kramdown extensions and block attributes
|
|
362
|
+
if is_kramdown_extension(line) || is_kramdown_block_attribute(line) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
|
|
308
366
|
// Find all HTML tags in the line using regex
|
|
309
367
|
for tag_match in HTML_TAG_FINDER.find_iter(line) {
|
|
310
368
|
let tag = tag_match.as_str();
|
|
@@ -356,8 +414,8 @@ impl Rule for MD033NoInlineHtml {
|
|
|
356
414
|
}
|
|
357
415
|
}
|
|
358
416
|
|
|
359
|
-
//
|
|
360
|
-
self.find_multiline_html_tags(ctx.content, structure, &mut warnings);
|
|
417
|
+
// Third pass: find multi-line HTML tags
|
|
418
|
+
self.find_multiline_html_tags(ctx.content, structure, &nomarkdown_ranges, &mut warnings);
|
|
361
419
|
|
|
362
420
|
Ok(warnings)
|
|
363
421
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
5
5
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
6
6
|
use crate::utils::emphasis_utils::{EmphasisSpan, find_emphasis_markers, find_emphasis_spans, has_doc_patterns};
|
|
7
|
+
use crate::utils::kramdown_utils::has_span_ial;
|
|
7
8
|
use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
|
|
8
9
|
use lazy_static::lazy_static;
|
|
9
10
|
use regex::Regex;
|
|
@@ -330,6 +331,16 @@ impl MD037NoSpaceInEmphasis {
|
|
|
330
331
|
let full_end = span.closing.end_pos();
|
|
331
332
|
let full_text = &content[full_start..full_end];
|
|
332
333
|
|
|
334
|
+
// Skip if this emphasis has a Kramdown span IAL immediately after it
|
|
335
|
+
// (no space between emphasis and IAL)
|
|
336
|
+
if full_end < content.len() {
|
|
337
|
+
let remaining = &content[full_end..];
|
|
338
|
+
// Check if IAL starts immediately after the emphasis (no whitespace)
|
|
339
|
+
if remaining.starts_with('{') && has_span_ial(remaining.split_whitespace().next().unwrap_or("")) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
333
344
|
// Create the marker string efficiently
|
|
334
345
|
let marker_char = span.opening.as_char();
|
|
335
346
|
let marker_str = if span.opening.count == 1 {
|
|
@@ -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
|
}
|