rumdl 0.0.99__tar.gz → 0.0.101__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.99 → rumdl-0.0.101}/CHANGELOG.md +25 -1
- {rumdl-0.0.99 → rumdl-0.0.101}/Cargo.lock +7 -7
- {rumdl-0.0.99 → rumdl-0.0.101}/Cargo.toml +1 -1
- {rumdl-0.0.99 → rumdl-0.0.101}/Makefile +12 -6
- {rumdl-0.0.99 → rumdl-0.0.101}/PKG-INFO +2 -2
- {rumdl-0.0.99 → rumdl-0.0.101}/README.md +1 -1
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/global-settings.md +1 -1
- rumdl-0.0.101/scripts/update-pre-commit-docs.sh +35 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/lint_context.rs +119 -41
- {rumdl-0.0.99 → rumdl-0.0.101}/src/main.rs +37 -1
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md005_list_indent.rs +1 -7
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md006_start_bullets.rs +4 -13
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md007_ul_indent.rs +5 -12
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md009_trailing_spaces.rs +7 -14
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md010_no_hard_tabs.rs +2 -7
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md011_no_reversed_links.rs +0 -1
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md013_line_length.rs +3 -24
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md020_no_missing_space_closed_atx.rs +3 -10
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md025_single_title.rs +3 -15
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md029_ordered_list_prefix.rs +4 -5
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md031_blanks_around_fences.rs +0 -6
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md032_blanks_around_lists.rs +63 -74
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md034_no_bare_urls.rs +3 -9
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md035_hr_style.rs +3 -11
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md037_spaces_around_emphasis.rs +3 -9
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md041_first_line_heading.rs +2 -9
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md045_no_alt_text.rs +112 -18
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md046_code_block_style.rs +0 -6
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/document_structure.rs +147 -107
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/regex_cache.rs +35 -0
- rumdl-0.0.101/tests/deeply_nested_lists_performance_test.rs +455 -0
- rumdl-0.0.101/tests/escaped_brackets_test.rs +89 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/inline_content_edge_cases_test.rs +2 -2
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md045_test.rs +27 -12
- {rumdl-0.0.99 → rumdl-0.0.101}/.config/nextest.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/.mise.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/.rumdl.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/.rustfmt.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/LICENSE +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/MANIFEST.in +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/assets/logo.png +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/benches/range_performance.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/RULES.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md001.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md002.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md003.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md004.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md005.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md006.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md007.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md009.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md010.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md011.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md012.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md013.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md014.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md018.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md019.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md020.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md021.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md022.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md023.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md024.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md025.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md026.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md027.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md028.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md029.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md030.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md031.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md032.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md033.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md034.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md035.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md036.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md037.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md038.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md039.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md040.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md041.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md042.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md043.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md044.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md045.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md046.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md047.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md048.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md049.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md050.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md051.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md052.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md053.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md054.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md055.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md056.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md057.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/md058.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/parity_check.py +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/pyproject.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/python/MANIFEST.in +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/rumdl.toml.example +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/rust-toolchain.toml +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/bin/benchmark.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/exit_codes.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/init.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/inline_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/lib.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/lsp/server.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/lsp/types.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/output/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/parallel.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/performance.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/profiling.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/python.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rule.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rule_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/src/vscode.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/config_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/init_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/lib.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/perf_check.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.99 → rumdl-0.0.101}/tests/vscode_tests.rs +0 -0
|
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.101] - 2025-07-23
|
|
11
|
+
|
|
12
|
+
## [0.0.100] - 2025-07-22
|
|
13
|
+
|
|
14
|
+
### Performance Improvements
|
|
15
|
+
- **MD032**: Eliminated redundant DocumentStructure creation through optimization interface delegation
|
|
16
|
+
- Refactored check() method to delegate to check_with_structure() for shared parsing
|
|
17
|
+
- Added fix_with_structure() helper method for optimized fixing operations
|
|
18
|
+
- **List Processing**: Major refactoring of complex list block merging logic for better maintainability
|
|
19
|
+
- Extracted merge_adjacent_list_blocks into clean ListBlockMerger struct
|
|
20
|
+
- Introduced BlockSpacing enum for clear categorization of list spacing types
|
|
21
|
+
- Separated compatibility checking, spacing analysis, and merging logic into focused methods
|
|
22
|
+
- **Memory Management**: Added comprehensive performance stress tests for deeply nested lists
|
|
23
|
+
- Created benchmarks for up to 20 levels of nesting with measurable performance baselines
|
|
24
|
+
- Established performance thresholds: <3ms parsing, <4ms rule checking for extreme nesting
|
|
25
|
+
- Added memory stress testing to prevent performance regressions
|
|
26
|
+
|
|
27
|
+
### Code Quality
|
|
28
|
+
- Improved separation of concerns in list processing logic
|
|
29
|
+
- Enhanced code maintainability through better structured algorithms
|
|
30
|
+
- Added comprehensive test coverage for pathological markdown structures
|
|
31
|
+
|
|
10
32
|
## [0.0.99] - 2025-07-22
|
|
11
33
|
|
|
12
34
|
### Fixed
|
|
@@ -223,7 +245,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
223
245
|
|
|
224
246
|
- Initial implementation of remaining rules for markdownlint parity
|
|
225
247
|
|
|
226
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
248
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.101...HEAD
|
|
249
|
+
[0.0.101]: https://github.com/rvben/rumdl/compare/v0.0.100...v0.0.101
|
|
250
|
+
[0.0.100]: https://github.com/rvben/rumdl/compare/v0.0.99...v0.0.100
|
|
227
251
|
[0.0.99]: https://github.com/rvben/rumdl/compare/v0.0.98...v0.0.99
|
|
228
252
|
[0.0.98]: https://github.com/rvben/rumdl/compare/v0.0.97...v0.0.98
|
|
229
253
|
[0.0.97]: https://github.com/rvben/rumdl/compare/v0.0.96...v0.0.97
|
|
@@ -859,9 +859,9 @@ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
|
|
859
859
|
|
|
860
860
|
[[package]]
|
|
861
861
|
name = "io-uring"
|
|
862
|
-
version = "0.7.
|
|
862
|
+
version = "0.7.9"
|
|
863
863
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
864
|
-
checksum = "
|
|
864
|
+
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
|
|
865
865
|
dependencies = [
|
|
866
866
|
"bitflags 2.9.1",
|
|
867
867
|
"cfg-if",
|
|
@@ -1397,9 +1397,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
|
|
1397
1397
|
|
|
1398
1398
|
[[package]]
|
|
1399
1399
|
name = "rand"
|
|
1400
|
-
version = "0.9.
|
|
1400
|
+
version = "0.9.2"
|
|
1401
1401
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1402
|
-
checksum = "
|
|
1402
|
+
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
|
1403
1403
|
dependencies = [
|
|
1404
1404
|
"rand_chacha",
|
|
1405
1405
|
"rand_core",
|
|
@@ -1455,9 +1455,9 @@ dependencies = [
|
|
|
1455
1455
|
|
|
1456
1456
|
[[package]]
|
|
1457
1457
|
name = "redox_syscall"
|
|
1458
|
-
version = "0.5.
|
|
1458
|
+
version = "0.5.15"
|
|
1459
1459
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1460
|
-
checksum = "
|
|
1460
|
+
checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec"
|
|
1461
1461
|
dependencies = [
|
|
1462
1462
|
"bitflags 2.9.1",
|
|
1463
1463
|
]
|
|
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|
|
1493
1493
|
|
|
1494
1494
|
[[package]]
|
|
1495
1495
|
name = "rumdl"
|
|
1496
|
-
version = "0.0.
|
|
1496
|
+
version = "0.0.101"
|
|
1497
1497
|
dependencies = [
|
|
1498
1498
|
"anyhow",
|
|
1499
1499
|
"assert_cmd",
|
|
@@ -124,6 +124,12 @@ update-readme-version:
|
|
|
124
124
|
@rm -f README.md.bak
|
|
125
125
|
@echo "README.md updated to rev $(NEW_TAG)"
|
|
126
126
|
|
|
127
|
+
update-all-docs-version:
|
|
128
|
+
@echo "Updating all documentation to use $(NEW_TAG)..."
|
|
129
|
+
@perl -i.bak -E 's/rev: v[0-9]+\.[0-9]+\.[0-9]+/rev: $(NEW_TAG)/g' README.md docs/global-settings.md ../rumdl-pre-commit/README.md 2>/dev/null || true
|
|
130
|
+
@rm -f README.md.bak docs/global-settings.md.bak ../rumdl-pre-commit/README.md.bak 2>/dev/null || true
|
|
131
|
+
@echo "All documentation updated to rev $(NEW_TAG)"
|
|
132
|
+
|
|
127
133
|
update-changelog:
|
|
128
134
|
@echo "Updating CHANGELOG.md for $(NEW_TAG)..."
|
|
129
135
|
@if [ -f CHANGELOG.md ]; then \
|
|
@@ -145,9 +151,9 @@ version-major:
|
|
|
145
151
|
$(eval VERSION_NO_V := $(NEW_MAJOR).0.0)
|
|
146
152
|
@echo "Current: $(CURRENT) -> New: $(NEW_TAG)"
|
|
147
153
|
@$(MAKE) update-cargo-version VERSION_NO_V=$(VERSION_NO_V)
|
|
148
|
-
@$(MAKE) update-
|
|
154
|
+
@$(MAKE) update-all-docs-version NEW_TAG=$(NEW_TAG)
|
|
149
155
|
@$(MAKE) update-changelog NEW_TAG=$(NEW_TAG) VERSION_NO_V=$(VERSION_NO_V) CURRENT=$(CURRENT)
|
|
150
|
-
@git add Cargo.toml Cargo.lock README.md CHANGELOG.md
|
|
156
|
+
@git add Cargo.toml Cargo.lock README.md docs/global-settings.md CHANGELOG.md
|
|
151
157
|
@git commit -m "Bump version to $(NEW_TAG)"
|
|
152
158
|
@git tag -a $(NEW_TAG) -m "Release $(NEW_TAG)"
|
|
153
159
|
@echo "Version $(NEW_TAG) created and committed. Run 'git push && git push origin $(NEW_TAG)' to trigger release workflow."
|
|
@@ -162,9 +168,9 @@ version-minor:
|
|
|
162
168
|
$(eval VERSION_NO_V := $(MAJOR).$(NEW_MINOR).0)
|
|
163
169
|
@echo "Current: $(CURRENT) -> New: $(NEW_TAG)"
|
|
164
170
|
@$(MAKE) update-cargo-version VERSION_NO_V=$(VERSION_NO_V)
|
|
165
|
-
@$(MAKE) update-
|
|
171
|
+
@$(MAKE) update-all-docs-version NEW_TAG=$(NEW_TAG)
|
|
166
172
|
@$(MAKE) update-changelog NEW_TAG=$(NEW_TAG) VERSION_NO_V=$(VERSION_NO_V) CURRENT=$(CURRENT)
|
|
167
|
-
@git add Cargo.toml Cargo.lock README.md CHANGELOG.md
|
|
173
|
+
@git add Cargo.toml Cargo.lock README.md docs/global-settings.md CHANGELOG.md
|
|
168
174
|
@git commit -m "Bump version to $(NEW_TAG)"
|
|
169
175
|
@git tag -a $(NEW_TAG) -m "Release $(NEW_TAG)"
|
|
170
176
|
@echo "Version $(NEW_TAG) created and committed. Run 'git push && git push origin $(NEW_TAG)' to trigger release workflow."
|
|
@@ -180,9 +186,9 @@ version-patch:
|
|
|
180
186
|
$(eval VERSION_NO_V := $(MAJOR).$(MINOR).$(NEW_PATCH))
|
|
181
187
|
@echo "Current: $(CURRENT) -> New: $(NEW_TAG)"
|
|
182
188
|
@$(MAKE) update-cargo-version VERSION_NO_V=$(VERSION_NO_V)
|
|
183
|
-
@$(MAKE) update-
|
|
189
|
+
@$(MAKE) update-all-docs-version NEW_TAG=$(NEW_TAG)
|
|
184
190
|
@$(MAKE) update-changelog NEW_TAG=$(NEW_TAG) VERSION_NO_V=$(VERSION_NO_V) CURRENT=$(CURRENT)
|
|
185
|
-
@git add Cargo.toml Cargo.lock README.md CHANGELOG.md
|
|
191
|
+
@git add Cargo.toml Cargo.lock README.md docs/global-settings.md CHANGELOG.md
|
|
186
192
|
@git commit -m "Bump version to $(NEW_TAG)"
|
|
187
193
|
@git tag -a $(NEW_TAG) -m "Release $(NEW_TAG)"
|
|
188
194
|
@echo "Version $(NEW_TAG) created and committed. Run 'git push && git push origin $(NEW_TAG)' to trigger release workflow."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rumdl
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.101
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -242,7 +242,7 @@ Add the following to your `.pre-commit-config.yaml`:
|
|
|
242
242
|
```yaml
|
|
243
243
|
repos:
|
|
244
244
|
- repo: https://github.com/rvben/rumdl-pre-commit
|
|
245
|
-
rev: v0.0.
|
|
245
|
+
rev: v0.0.99 # Use the latest release tag
|
|
246
246
|
hooks:
|
|
247
247
|
- id: rumdl
|
|
248
248
|
# To only check (default):
|
|
@@ -211,7 +211,7 @@ Add the following to your `.pre-commit-config.yaml`:
|
|
|
211
211
|
```yaml
|
|
212
212
|
repos:
|
|
213
213
|
- repo: https://github.com/rvben/rumdl-pre-commit
|
|
214
|
-
rev: v0.0.
|
|
214
|
+
rev: v0.0.99 # Use the latest release tag
|
|
215
215
|
hooks:
|
|
216
216
|
- id: rumdl
|
|
217
217
|
# To only check (default):
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Script to update rumdl-pre-commit version references in documentation
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
# Get the latest release version
|
|
7
|
+
LATEST_VERSION=$(gh release list --repo rvben/rumdl --limit 1 | awk '{print $1}')
|
|
8
|
+
|
|
9
|
+
if [ -z "$LATEST_VERSION" ]; then
|
|
10
|
+
echo "Error: Could not determine latest version"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
echo "Latest rumdl version: $LATEST_VERSION"
|
|
15
|
+
|
|
16
|
+
# Update version in all documentation files
|
|
17
|
+
FILES=(
|
|
18
|
+
"README.md"
|
|
19
|
+
"docs/global-settings.md"
|
|
20
|
+
"../rumdl-pre-commit/README.md"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
for file in "${FILES[@]}"; do
|
|
24
|
+
if [ -f "$file" ]; then
|
|
25
|
+
echo "Updating $file..."
|
|
26
|
+
# Update rev: vX.X.X patterns
|
|
27
|
+
sed -i.bak -E "s/rev: v[0-9]+\.[0-9]+\.[0-9]+/rev: $LATEST_VERSION/g" "$file"
|
|
28
|
+
# Clean up backup files
|
|
29
|
+
rm -f "${file}.bak"
|
|
30
|
+
else
|
|
31
|
+
echo "Warning: $file not found"
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
echo "Documentation updated to use $LATEST_VERSION"
|
|
@@ -1263,52 +1263,130 @@ fn merge_adjacent_list_blocks(list_blocks: &mut Vec<ListBlock>, lines: &[LineInf
|
|
|
1263
1263
|
return;
|
|
1264
1264
|
}
|
|
1265
1265
|
|
|
1266
|
-
let mut
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
if should_merge {
|
|
1292
|
-
// Merge blocks
|
|
1293
|
-
current.end_line = next.end_line;
|
|
1294
|
-
current.item_lines.extend_from_slice(&next.item_lines);
|
|
1295
|
-
|
|
1296
|
-
// Update marker consistency
|
|
1297
|
-
if !current.is_ordered && current.marker.is_some() && next.marker.is_some() && current.marker != next.marker
|
|
1298
|
-
{
|
|
1299
|
-
current.marker = None; // Mixed markers
|
|
1266
|
+
let mut merger = ListBlockMerger::new(lines);
|
|
1267
|
+
*list_blocks = merger.merge(list_blocks);
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
/// Helper struct to manage the complex logic of merging list blocks
|
|
1271
|
+
struct ListBlockMerger<'a> {
|
|
1272
|
+
lines: &'a [LineInfo],
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
impl<'a> ListBlockMerger<'a> {
|
|
1276
|
+
fn new(lines: &'a [LineInfo]) -> Self {
|
|
1277
|
+
Self { lines }
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
fn merge(&mut self, list_blocks: &[ListBlock]) -> Vec<ListBlock> {
|
|
1281
|
+
let mut merged = Vec::with_capacity(list_blocks.len());
|
|
1282
|
+
let mut current = list_blocks[0].clone();
|
|
1283
|
+
|
|
1284
|
+
for next in list_blocks.iter().skip(1) {
|
|
1285
|
+
if self.should_merge_blocks(¤t, next) {
|
|
1286
|
+
current = self.merge_two_blocks(current, next);
|
|
1287
|
+
} else {
|
|
1288
|
+
merged.push(current);
|
|
1289
|
+
current = next.clone();
|
|
1300
1290
|
}
|
|
1301
|
-
} else {
|
|
1302
|
-
// Save current and start new
|
|
1303
|
-
merged.push(current);
|
|
1304
|
-
current = next.clone();
|
|
1305
1291
|
}
|
|
1292
|
+
|
|
1293
|
+
merged.push(current);
|
|
1294
|
+
merged
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
/// Determine if two adjacent list blocks should be merged
|
|
1298
|
+
fn should_merge_blocks(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1299
|
+
// Basic compatibility checks
|
|
1300
|
+
if !self.blocks_are_compatible(current, next) {
|
|
1301
|
+
return false;
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
// Check spacing and content between blocks
|
|
1305
|
+
let spacing = self.analyze_spacing_between(current, next);
|
|
1306
|
+
match spacing {
|
|
1307
|
+
BlockSpacing::Consecutive => true,
|
|
1308
|
+
BlockSpacing::SingleBlank => self.can_merge_with_blank_between(current, next),
|
|
1309
|
+
BlockSpacing::MultipleBlanks | BlockSpacing::ContentBetween => {
|
|
1310
|
+
self.can_merge_with_content_between(current, next)
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
/// Check if blocks have compatible structure for merging
|
|
1316
|
+
fn blocks_are_compatible(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1317
|
+
current.is_ordered == next.is_ordered
|
|
1318
|
+
&& current.blockquote_prefix == next.blockquote_prefix
|
|
1319
|
+
&& current.nesting_level == next.nesting_level
|
|
1306
1320
|
}
|
|
1307
1321
|
|
|
1308
|
-
|
|
1309
|
-
|
|
1322
|
+
/// Analyze the spacing between two list blocks
|
|
1323
|
+
fn analyze_spacing_between(&self, current: &ListBlock, next: &ListBlock) -> BlockSpacing {
|
|
1324
|
+
let gap = next.start_line - current.end_line;
|
|
1325
|
+
|
|
1326
|
+
match gap {
|
|
1327
|
+
1 => BlockSpacing::Consecutive,
|
|
1328
|
+
2 => BlockSpacing::SingleBlank,
|
|
1329
|
+
_ if gap > 2 => {
|
|
1330
|
+
if self.has_only_blank_lines_between(current, next) {
|
|
1331
|
+
BlockSpacing::MultipleBlanks
|
|
1332
|
+
} else {
|
|
1333
|
+
BlockSpacing::ContentBetween
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
_ => BlockSpacing::Consecutive, // gap == 0, overlapping (shouldn't happen)
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
/// Check if unordered lists can be merged with a single blank line between
|
|
1341
|
+
fn can_merge_with_blank_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1342
|
+
// Only merge unordered lists with same marker across single blank
|
|
1343
|
+
!current.is_ordered && current.marker == next.marker
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
/// Check if ordered lists can be merged when there's content between them
|
|
1347
|
+
fn can_merge_with_content_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1348
|
+
// Only consider merging ordered lists with meaningful content between
|
|
1349
|
+
current.is_ordered && next.is_ordered && has_meaningful_content_between(current, next, self.lines)
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
/// Check if there are only blank lines between blocks
|
|
1353
|
+
fn has_only_blank_lines_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1354
|
+
for line_num in (current.end_line + 1)..next.start_line {
|
|
1355
|
+
if let Some(line_info) = self.lines.get(line_num - 1) {
|
|
1356
|
+
if !line_info.content.trim().is_empty() {
|
|
1357
|
+
return false;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
true
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
/// Merge two compatible list blocks into one
|
|
1365
|
+
fn merge_two_blocks(&self, mut current: ListBlock, next: &ListBlock) -> ListBlock {
|
|
1366
|
+
current.end_line = next.end_line;
|
|
1367
|
+
current.item_lines.extend_from_slice(&next.item_lines);
|
|
1368
|
+
|
|
1369
|
+
// Handle marker consistency for unordered lists
|
|
1370
|
+
if !current.is_ordered && self.markers_differ(¤t, next) {
|
|
1371
|
+
current.marker = None; // Mixed markers
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
current
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
/// Check if two blocks have different markers
|
|
1378
|
+
fn markers_differ(&self, current: &ListBlock, next: &ListBlock) -> bool {
|
|
1379
|
+
current.marker.is_some() && next.marker.is_some() && current.marker != next.marker
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1310
1382
|
|
|
1311
|
-
|
|
1383
|
+
/// Types of spacing between list blocks
|
|
1384
|
+
#[derive(Debug, PartialEq)]
|
|
1385
|
+
enum BlockSpacing {
|
|
1386
|
+
Consecutive, // No gap between blocks
|
|
1387
|
+
SingleBlank, // One blank line between blocks
|
|
1388
|
+
MultipleBlanks, // Multiple blank lines but no content
|
|
1389
|
+
ContentBetween, // Content exists between blocks
|
|
1312
1390
|
}
|
|
1313
1391
|
|
|
1314
1392
|
/// Check if there's meaningful content (not just blank lines) between two list blocks
|
|
@@ -609,6 +609,37 @@ fn find_markdown_files(
|
|
|
609
609
|
// Add support for .markdownlintignore file
|
|
610
610
|
walk_builder.add_custom_ignore_filename(".markdownlintignore");
|
|
611
611
|
|
|
612
|
+
// --- Pre-check for explicit file paths ---
|
|
613
|
+
// If not in discovery mode, validate that specified paths exist
|
|
614
|
+
if !is_discovery_mode {
|
|
615
|
+
for path_str in paths {
|
|
616
|
+
let path = Path::new(path_str);
|
|
617
|
+
if !path.exists() {
|
|
618
|
+
return Err(format!("File not found: {path_str}").into());
|
|
619
|
+
}
|
|
620
|
+
// If it's a file, check if it's a markdown file and add it directly
|
|
621
|
+
if path.is_file() {
|
|
622
|
+
if let Some(ext) = path.extension() {
|
|
623
|
+
if ext == "md" || ext == "markdown" {
|
|
624
|
+
let cleaned_path = if let Some(stripped) = path_str.strip_prefix("./") {
|
|
625
|
+
stripped.to_string()
|
|
626
|
+
} else {
|
|
627
|
+
path_str.clone()
|
|
628
|
+
};
|
|
629
|
+
file_paths.push(cleaned_path);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
// If we found files directly, skip the walker
|
|
636
|
+
if !file_paths.is_empty() {
|
|
637
|
+
file_paths.sort();
|
|
638
|
+
file_paths.dedup();
|
|
639
|
+
return Ok(file_paths);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
612
643
|
// --- Execute Walk ---
|
|
613
644
|
|
|
614
645
|
for result in walk_builder.build() {
|
|
@@ -628,7 +659,12 @@ fn find_markdown_files(
|
|
|
628
659
|
file_paths.push(cleaned_path);
|
|
629
660
|
}
|
|
630
661
|
}
|
|
631
|
-
Err(err) =>
|
|
662
|
+
Err(err) => {
|
|
663
|
+
// Only show generic walking errors for directories, not for missing files
|
|
664
|
+
if is_discovery_mode {
|
|
665
|
+
eprintln!("Error walking directory: {err}");
|
|
666
|
+
}
|
|
667
|
+
}
|
|
632
668
|
}
|
|
633
669
|
}
|
|
634
670
|
|
|
@@ -7,16 +7,10 @@ use crate::utils::range_utils::{LineIndex, calculate_match_range};
|
|
|
7
7
|
|
|
8
8
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
9
9
|
use crate::utils::document_structure::DocumentStructure;
|
|
10
|
-
|
|
11
|
-
use regex::Regex;
|
|
10
|
+
// No regex patterns needed for this rule
|
|
12
11
|
use std::collections::HashMap;
|
|
13
12
|
use toml;
|
|
14
13
|
|
|
15
|
-
lazy_static! {
|
|
16
|
-
// Regex to match blockquote prefixes (one or more '>' with optional spaces)
|
|
17
|
-
static ref BLOCKQUOTE_PREFIX: Regex = Regex::new(r"^(\s*>\s*)+").unwrap();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
14
|
/// Rule MD005: Inconsistent indentation for list items at the same level
|
|
21
15
|
#[derive(Clone)]
|
|
22
16
|
pub struct MD005ListIndent;
|
|
@@ -2,8 +2,7 @@ use crate::utils::range_utils::LineIndex;
|
|
|
2
2
|
|
|
3
3
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
4
4
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
5
|
-
use
|
|
6
|
-
use regex::Regex;
|
|
5
|
+
use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
|
|
7
6
|
|
|
8
7
|
/// Rule MD006: Consider starting bulleted lists at the leftmost column
|
|
9
8
|
///
|
|
@@ -16,14 +15,6 @@ use regex::Regex;
|
|
|
16
15
|
#[derive(Clone)]
|
|
17
16
|
pub struct MD006StartBullets;
|
|
18
17
|
|
|
19
|
-
lazy_static! {
|
|
20
|
-
// Pattern to match bullet list items: captures indentation, marker, and space after marker
|
|
21
|
-
static ref BULLET_PATTERN: Regex = Regex::new(r"^(\s*)([*+-])(\s+)").unwrap();
|
|
22
|
-
|
|
23
|
-
// Pattern to match code fence markers
|
|
24
|
-
static ref CODE_FENCE_PATTERN: Regex = Regex::new(r"^(\s*)(```|~~~)").unwrap();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
18
|
impl MD006StartBullets {
|
|
28
19
|
/// Optimized check using centralized list blocks
|
|
29
20
|
fn check_optimized(&self, ctx: &crate::lint_context::LintContext) -> LintResult {
|
|
@@ -84,7 +75,7 @@ impl MD006StartBullets {
|
|
|
84
75
|
|
|
85
76
|
// For the fix, we need to replace the highlighted part with just the bullet marker
|
|
86
77
|
let trimmed = line.trim_start();
|
|
87
|
-
let bullet_part = if let Some(captures) =
|
|
78
|
+
let bullet_part = if let Some(captures) = UNORDERED_LIST_MARKER_REGEX.captures(trimmed) {
|
|
88
79
|
let marker = captures.get(2).map_or("*", |m| m.as_str());
|
|
89
80
|
format!("{marker} ")
|
|
90
81
|
} else {
|
|
@@ -123,7 +114,7 @@ impl MD006StartBullets {
|
|
|
123
114
|
}
|
|
124
115
|
/// Checks if a line is a bullet list item and returns its indentation level
|
|
125
116
|
fn is_bullet_list_item(line: &str) -> Option<usize> {
|
|
126
|
-
if let Some(captures) =
|
|
117
|
+
if let Some(captures) = UNORDERED_LIST_MARKER_REGEX.captures(line) {
|
|
127
118
|
if let Some(indent) = captures.get(1) {
|
|
128
119
|
return Some(indent.as_str().len());
|
|
129
120
|
}
|
|
@@ -338,7 +329,7 @@ impl Rule for MD006StartBullets {
|
|
|
338
329
|
let line = lines[line_idx];
|
|
339
330
|
let trimmed = line.trim_start();
|
|
340
331
|
// Extract just the bullet marker and normalize to single space
|
|
341
|
-
let bullet_part = if let Some(captures) =
|
|
332
|
+
let bullet_part = if let Some(captures) = UNORDERED_LIST_MARKER_REGEX.captures(trimmed) {
|
|
342
333
|
format!("{} ", captures.get(2).unwrap().as_str()) // Always use single space
|
|
343
334
|
} else {
|
|
344
335
|
"* ".to_string() // fallback
|
|
@@ -5,8 +5,7 @@ use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severi
|
|
|
5
5
|
use crate::rule_config_serde::RuleConfig;
|
|
6
6
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
7
7
|
use crate::utils::element_cache::{ElementCache, ListMarkerType};
|
|
8
|
-
use
|
|
9
|
-
use regex::Regex;
|
|
8
|
+
use crate::utils::regex_cache::{CODE_FENCE_REGEX, UNORDERED_LIST_MARKER_REGEX};
|
|
10
9
|
use toml;
|
|
11
10
|
|
|
12
11
|
mod md007_config;
|
|
@@ -17,10 +16,6 @@ pub struct MD007ULIndent {
|
|
|
17
16
|
config: MD007Config,
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
lazy_static! {
|
|
21
|
-
static ref LIST_ITEM_PATTERN: Regex = Regex::new(r"^(\s*)([*+-])(\s+)(.*)$").unwrap();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
19
|
impl MD007ULIndent {
|
|
25
20
|
pub fn new(indent: usize) -> Self {
|
|
26
21
|
Self {
|
|
@@ -38,9 +33,7 @@ impl MD007ULIndent {
|
|
|
38
33
|
|
|
39
34
|
#[allow(dead_code)]
|
|
40
35
|
fn is_in_code_block(content: &str, line_idx: usize) -> bool {
|
|
41
|
-
|
|
42
|
-
static ref CODE_BLOCK_MARKER: Regex = Regex::new(r"^(```|~~~)").unwrap();
|
|
43
|
-
}
|
|
36
|
+
// Use centralized code fence pattern
|
|
44
37
|
|
|
45
38
|
let lines: Vec<&str> = content.lines().collect();
|
|
46
39
|
let mut in_code_block = false;
|
|
@@ -50,7 +43,7 @@ impl MD007ULIndent {
|
|
|
50
43
|
break;
|
|
51
44
|
}
|
|
52
45
|
|
|
53
|
-
if
|
|
46
|
+
if CODE_FENCE_REGEX.is_match(line.trim_start()) {
|
|
54
47
|
in_code_block = !in_code_block;
|
|
55
48
|
}
|
|
56
49
|
|
|
@@ -116,7 +109,7 @@ impl Rule for MD007ULIndent {
|
|
|
116
109
|
let lines: Vec<&str> = content.lines().collect();
|
|
117
110
|
if let Some(line) = lines.get(item.line_number - 1) {
|
|
118
111
|
// Extract the marker and content
|
|
119
|
-
if
|
|
112
|
+
if UNORDERED_LIST_MARKER_REGEX.captures(line).is_some() {
|
|
120
113
|
let correct_indent = " ".repeat(expected_indent);
|
|
121
114
|
|
|
122
115
|
// Fix range should match warning range - only the problematic indentation
|
|
@@ -212,7 +205,7 @@ impl Rule for MD007ULIndent {
|
|
|
212
205
|
let lines: Vec<&str> = content.lines().collect();
|
|
213
206
|
if let Some(line) = lines.get(item.line_number - 1) {
|
|
214
207
|
// Extract the marker and content
|
|
215
|
-
if
|
|
208
|
+
if UNORDERED_LIST_MARKER_REGEX.captures(line).is_some() {
|
|
216
209
|
let correct_indent = " ".repeat(expected_indent);
|
|
217
210
|
|
|
218
211
|
// Fix range should match warning range - only the problematic indentation
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
2
2
|
use crate::rule_config_serde::RuleConfig;
|
|
3
3
|
use crate::utils::range_utils::{LineIndex, calculate_trailing_range};
|
|
4
|
-
use crate::utils::regex_cache::get_cached_regex;
|
|
5
|
-
use lazy_static::lazy_static;
|
|
6
|
-
use regex::Regex;
|
|
4
|
+
use crate::utils::regex_cache::{ORDERED_LIST_MARKER_REGEX, UNORDERED_LIST_MARKER_REGEX, get_cached_regex};
|
|
7
5
|
|
|
8
6
|
mod md009_config;
|
|
9
7
|
use md009_config::MD009Config;
|
|
10
8
|
|
|
11
|
-
lazy_static
|
|
12
|
-
// Optimized regex patterns for fix operations
|
|
13
|
-
static ref TRAILING_SPACES_REGEX: std::sync::Arc<Regex> = get_cached_regex(r"(?m) +$").unwrap();
|
|
14
|
-
}
|
|
9
|
+
// No need for lazy_static, we'll use get_cached_regex directly
|
|
15
10
|
|
|
16
11
|
#[derive(Debug, Clone, Default)]
|
|
17
12
|
pub struct MD009TrailingSpaces {
|
|
@@ -52,12 +47,7 @@ impl MD009TrailingSpaces {
|
|
|
52
47
|
|
|
53
48
|
if let Some(prev) = prev_line {
|
|
54
49
|
// Check for unordered list markers (*, -, +) with proper formatting
|
|
55
|
-
|
|
56
|
-
static ref LIST_MARKER_REGEX: Regex = Regex::new(r"^(\s*)[-*+]\s+").unwrap();
|
|
57
|
-
static ref ORDERED_LIST_REGEX: Regex = Regex::new(r"^(\s*)\d+[.)]\s+").unwrap();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
LIST_MARKER_REGEX.is_match(prev) || ORDERED_LIST_REGEX.is_match(prev)
|
|
50
|
+
UNORDERED_LIST_MARKER_REGEX.is_match(prev) || ORDERED_LIST_MARKER_REGEX.is_match(prev)
|
|
61
51
|
} else {
|
|
62
52
|
false
|
|
63
53
|
}
|
|
@@ -204,7 +194,10 @@ impl Rule for MD009TrailingSpaces {
|
|
|
204
194
|
// For simple cases (strict mode), use fast regex approach
|
|
205
195
|
if self.config.strict {
|
|
206
196
|
// In strict mode, remove ALL trailing spaces everywhere
|
|
207
|
-
return Ok(
|
|
197
|
+
return Ok(get_cached_regex(r"(?m) +$")
|
|
198
|
+
.unwrap()
|
|
199
|
+
.replace_all(content, "")
|
|
200
|
+
.to_string());
|
|
208
201
|
}
|
|
209
202
|
|
|
210
203
|
// For complex cases, we need line-by-line processing but with optimizations
|
|
@@ -4,17 +4,12 @@ use crate::rule_config_serde::RuleConfig;
|
|
|
4
4
|
///
|
|
5
5
|
/// See [docs/md010.md](../../docs/md010.md) for full documentation, configuration, and examples.
|
|
6
6
|
use crate::utils::range_utils::{LineIndex, calculate_match_range};
|
|
7
|
-
use
|
|
8
|
-
use regex::Regex;
|
|
7
|
+
use crate::utils::regex_cache::{HTML_COMMENT_END, HTML_COMMENT_START};
|
|
9
8
|
|
|
10
9
|
mod md010_config;
|
|
11
10
|
use md010_config::MD010Config;
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
// Pattern to detect HTML comments (start and end tags separately)
|
|
15
|
-
static ref HTML_COMMENT_START: Regex = Regex::new(r"<!--").unwrap();
|
|
16
|
-
static ref HTML_COMMENT_END: Regex = Regex::new(r"-->").unwrap();
|
|
17
|
-
}
|
|
12
|
+
// HTML comment patterns are now imported from regex_cache
|
|
18
13
|
|
|
19
14
|
/// Rule MD010: Hard tabs
|
|
20
15
|
#[derive(Clone, Default)]
|
|
@@ -14,7 +14,6 @@ lazy_static! {
|
|
|
14
14
|
static ref REVERSED_LINK_CHECK_REGEX: Regex = Regex::new(
|
|
15
15
|
r"\(([^)]*(?:\([^)]*\)[^)]*)*)\)\[([^\]]+)\]"
|
|
16
16
|
).unwrap();
|
|
17
|
-
static ref CODE_FENCE_REGEX: Regex = Regex::new(r"^(\s*)(```|~~~)").unwrap();
|
|
18
17
|
|
|
19
18
|
// Pattern to detect escaped brackets and parentheses
|
|
20
19
|
static ref ESCAPED_CHARS: Regex = Regex::new(r"\\[\[\]()]").unwrap();
|