rumdl 0.0.151__tar.gz → 0.0.154__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.151 → rumdl-0.0.154}/Cargo.lock +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/Cargo.toml +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/PKG-INFO +1 -1
- rumdl-0.0.154/docs/LINTCONTEXT_OPTIMIZATION_PLAN.md +311 -0
- rumdl-0.0.154/docs/LINTCONTEXT_OPTIMIZATION_SUMMARY.md +251 -0
- rumdl-0.0.154/docs/LINTCONTEXT_PERFORMANCE_ANALYSIS.md +240 -0
- rumdl-0.0.154/docs/PHASE_2_OPTIMIZATION_COMPLETE.md +284 -0
- rumdl-0.0.154/docs/PHASE_3_OPTIMIZATION_COMPLETE.md +175 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/fix_coordinator.rs +2 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md001_heading_increment.rs +6 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md002_first_heading_h1.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md003_heading_style.rs +6 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md004_unordered_list_style.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md005_list_indent.rs +5 -5
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md006_start_bullets.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md007_ul_indent.rs +8 -6
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md010_no_hard_tabs.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md011_no_reversed_links.rs +4 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md012_no_multiple_blanks.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md013_line_length.rs +656 -44
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md014_commands_show_output.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md018_no_missing_space_atx.rs +5 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md019_no_multiple_space_atx.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md020_no_missing_space_closed_atx.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md021_no_multiple_space_closed_atx.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md022_blanks_around_headings.rs +6 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md023_heading_start_left.rs +5 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md024_no_duplicate_heading.rs +5 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md025_single_title.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md026_no_trailing_punctuation.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md027_multiple_spaces_blockquote.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md028_no_blanks_blockquote.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md029_ordered_list_prefix.rs +1 -4
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md030_list_marker_space.rs +5 -5
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md031_blanks_around_fences.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md032_blanks_around_lists.rs +6 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md033_no_inline_html.rs +2 -3
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md034_no_bare_urls.rs +34 -18
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md035_hr_style.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md036_no_emphasis_only_first.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md037_spaces_around_emphasis.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md038_no_space_in_code.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md039_no_space_in_links.rs +1 -11
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md040_fenced_code_language.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md041_first_line_heading.rs +3 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md042_no_empty_links.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md045_no_alt_text.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md046_code_block_style.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md047_single_trailing_newline.rs +29 -10
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md048_code_fence_style.rs +1 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md049_emphasis_style.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md050_strong_style.rs +2 -1
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md051_link_fragments.rs +90 -142
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md052_reference_links_images.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md053_link_image_reference_definitions.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md054_link_image_style.rs +4 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md055_table_pipe_style.rs +3 -6
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md056_table_column_count.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md057_existing_relative_links.rs +1 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md058_blanks_around_tables.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/anchor_styles/github.rs +16 -20
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/text_reflow.rs +76 -6
- rumdl-0.0.154/tests/md009_md013_integration_test.rs +172 -0
- rumdl-0.0.154/tests/md009_md013_order_test.rs +39 -0
- rumdl-0.0.154/tests/md013_hard_breaks_test.rs +294 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_comprehensive_test.rs +2 -2
- {rumdl-0.0.151 → rumdl-0.0.154}/.config/nextest.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/.mise.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/.rumdl.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/.rustfmt.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/CHANGELOG.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/LICENSE +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/MANIFEST.in +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/Makefile +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/README.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/assets/logo.png +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benches/range_performance.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/RULES.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/global-settings.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/inline-configuration.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md001.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md002.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md003.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md004.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md005.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md006.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md007.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md009.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md010.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md011.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md012.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md013.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md014.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md018.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md019.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md020.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md021.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md022.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md023.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md024.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md025.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md026.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md027.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md028.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md029.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md030.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md031.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md032.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md033.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md034.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md035.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md036.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md037.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md038.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md039.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md040.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md041.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md042.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md043.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md044.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md045.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md046.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md047.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md048.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md049.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md050.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md051.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md052.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md053.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md054.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md055.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md056.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md057.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/md058.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/parity_check.py +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/pyproject.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/python/MANIFEST.in +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/rumdl.schema.json +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/rumdl.toml.example +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/rust-toolchain.toml +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/exit_codes.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/inline_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/lib.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/lint_context.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/lsp/server.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/lsp/types.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/main.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/output/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/parallel.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/performance.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/profiling.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/python.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rule.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rule_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/anchor_styles/jekyll.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/anchor_styles/kramdown.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/anchor_styles/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/header_id_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/jinja_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/line_ending.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_admonitions.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_common.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_critic.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_footnotes.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_patterns.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_snippets.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_tabs.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocs_test_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mkdocstrings_refs.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/skip_context.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/src/vscode.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/common/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/config_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/config_upward_traversal_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/fix_counting_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/fix_performance_baseline_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/init_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lib.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_formatting_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_initialization_options_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_mkdocs_flavor_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/lsp_unopened_document_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md032_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md032_ordered_list_bug_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md033_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md037_xxxx_regression_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md038_false_positive_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md051_readme_bug_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md051_toc_bug_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md052_literal_brackets_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/md054_code_span_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/per_file_ignores_integration_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/perf_check.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md005_dynamic_indent_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md028_md009_interaction_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_code_block_separation_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_fix_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_issue42_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_property_based_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_regression_prevention_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md051_unicode_security_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/mkdocs_admonitions_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/mkdocs_extensions_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/mkdocs_snippets_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules/rule_interaction_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/sentence_per_line_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_ast_code_block_issue.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_gfm_vs_default_parsing.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_lint_context_flow.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_list_ast_structure.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_multiline_ast.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/test_underscore_edge_cases.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/unfixable_rules_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utf8_boundary_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.151 → rumdl-0.0.154}/tests/vscode_windows_test.rs +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# LintContext Optimization Implementation Plan
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document outlines the plan to optimize 54 rules that aren't using LintContext's early-exit optimization methods. The optimizations replace O(n) string scanning with O(1) cached character
|
|
6
|
+
frequency lookups.
|
|
7
|
+
|
|
8
|
+
## Analysis Summary
|
|
9
|
+
|
|
10
|
+
- **Total rules analyzed**: 54 rules without LintContext optimizations
|
|
11
|
+
- **Agent analysis completed**: 10 representative rules across different categories
|
|
12
|
+
- **Expected impact**: 10-100x speedup for documents without relevant markdown elements
|
|
13
|
+
|
|
14
|
+
## Optimization Categories
|
|
15
|
+
|
|
16
|
+
### Category 1: Direct Replacements (High Impact, Low Risk)
|
|
17
|
+
|
|
18
|
+
These rules can directly replace string scanning with LintContext methods.
|
|
19
|
+
|
|
20
|
+
#### 1. MD003 - Heading Style
|
|
21
|
+
|
|
22
|
+
**File**: `src/rules/md003_heading_style.rs`
|
|
23
|
+
**Current**: `!ctx.lines.iter().any(|line| line.heading.is_some())`
|
|
24
|
+
**Optimized**: `!ctx.likely_has_headings()`
|
|
25
|
+
**Location**: Line 237-240 in `should_skip()`
|
|
26
|
+
**Impact**: O(n) line iteration → O(1) character frequency check
|
|
27
|
+
|
|
28
|
+
#### 2. MD004 - Unordered List Style
|
|
29
|
+
|
|
30
|
+
**File**: `src/rules/md004_unordered_list_style.rs`
|
|
31
|
+
**Current**: `!ctx.content.contains(['*', '-', '+'])`
|
|
32
|
+
**Optimized**: `!ctx.likely_has_lists()`
|
|
33
|
+
**Locations**:
|
|
34
|
+
|
|
35
|
+
- Line 107-109 in `check()`
|
|
36
|
+
- Line 317 in `should_skip()`
|
|
37
|
+
**Impact**: O(n) string scan → O(1) integer comparison
|
|
38
|
+
|
|
39
|
+
#### 3. MD033 - No Inline HTML
|
|
40
|
+
|
|
41
|
+
**File**: `src/rules/md033_no_inline_html.rs`
|
|
42
|
+
**Current**: `!has_html_tags(content)` (custom function)
|
|
43
|
+
**Optimized**: `!ctx.likely_has_html()`
|
|
44
|
+
**Locations**:
|
|
45
|
+
|
|
46
|
+
- Line 287 in `check()`
|
|
47
|
+
- Line 438 in `should_skip()`
|
|
48
|
+
**Impact**: Eliminates redundant '<' character scanning
|
|
49
|
+
|
|
50
|
+
#### 4. MD042 - No Empty Links
|
|
51
|
+
|
|
52
|
+
**File**: `src/rules/md042_no_empty_links.rs`
|
|
53
|
+
**Current**: `!content.contains('[')`
|
|
54
|
+
**Optimized**: `!ctx.likely_has_links_or_images()`
|
|
55
|
+
**Location**: `should_skip()` method
|
|
56
|
+
**Impact**: O(n) string scan → O(1) bracket count check
|
|
57
|
+
|
|
58
|
+
#### 5. MD049 - Emphasis Style
|
|
59
|
+
|
|
60
|
+
**File**: `src/rules/md049_emphasis_style.rs`
|
|
61
|
+
**Current**: `!ctx.content.contains('*') && !ctx.content.contains('_')`
|
|
62
|
+
**Optimized**: `!ctx.likely_has_emphasis()`
|
|
63
|
+
**Locations**:
|
|
64
|
+
|
|
65
|
+
- Line 113-115 in `check()`
|
|
66
|
+
- Line 247 in `should_skip()`
|
|
67
|
+
|
|
68
|
+
**Impact**: Two O(n) scans → O(1) check (asterisk_count > 1 || underscore_count > 1)
|
|
69
|
+
|
|
70
|
+
#### 6. MD050 - Strong Style
|
|
71
|
+
|
|
72
|
+
**File**: `src/rules/md050_strong_style.rs`
|
|
73
|
+
**Current**: Similar to MD049 (checks for ** and __)
|
|
74
|
+
**Optimized**: Create `ctx.likely_has_strong()` or use `likely_has_emphasis()`
|
|
75
|
+
**Impact**: Same as MD049
|
|
76
|
+
|
|
77
|
+
#### 7. MD055 - Table Pipe Style
|
|
78
|
+
|
|
79
|
+
**File**: `src/rules/md055_table_pipe_style.rs`
|
|
80
|
+
**Current**: `!ctx.content.contains('|')`
|
|
81
|
+
**Optimized**: `!ctx.likely_has_tables()`
|
|
82
|
+
**Locations**:
|
|
83
|
+
|
|
84
|
+
- Line 174-177 in `should_skip()`
|
|
85
|
+
- Line 185-187 in `check()` (remove - redundant)
|
|
86
|
+
**Impact**: O(n) scan → O(1) check (pipe_count > 2)
|
|
87
|
+
|
|
88
|
+
#### 8. MD027 - Multiple Spaces in Blockquote
|
|
89
|
+
|
|
90
|
+
**File**: `src/rules/md027_multiple_spaces_blockquote.rs`
|
|
91
|
+
**Current**: `!ctx.content.contains('>')`
|
|
92
|
+
**Optimized**: `!ctx.likely_has_blockquotes()`
|
|
93
|
+
**Location**: Line 192 in `should_skip()`
|
|
94
|
+
**Impact**: O(n) scan → O(1) check (gt_count > 0)
|
|
95
|
+
|
|
96
|
+
### Category 2: Compound Checks (Medium Impact)
|
|
97
|
+
|
|
98
|
+
#### 9. MD040 - Fenced Code Language
|
|
99
|
+
|
|
100
|
+
**File**: `src/rules/md040_fenced_code_language.rs`
|
|
101
|
+
**Current**: `!content.contains("```") && !content.contains("~~~")`
|
|
102
|
+
**Optimized**: `!ctx.likely_has_code() && !ctx.has_char('~')`
|
|
103
|
+
**Location**: Line 341-344 in `should_skip()`
|
|
104
|
+
**Impact**: Two O(n) substring scans → O(1) + O(n) character check
|
|
105
|
+
**Note**: `likely_has_code()` only checks backticks; need separate tilde check
|
|
106
|
+
|
|
107
|
+
#### 10. MD031 - Blanks Around Fences
|
|
108
|
+
|
|
109
|
+
**File**: `src/rules/md031_blanks_around_fences.rs`
|
|
110
|
+
**Current**: TBD (needs analysis)
|
|
111
|
+
**Optimized**: Use `ctx.likely_has_code()`
|
|
112
|
+
**Impact**: TBD
|
|
113
|
+
|
|
114
|
+
#### 11. MD046 - Code Block Style
|
|
115
|
+
|
|
116
|
+
**File**: `src/rules/md046_code_block_style.rs`
|
|
117
|
+
**Current**: TBD (needs analysis)
|
|
118
|
+
**Optimized**: Use `ctx.likely_has_code()`
|
|
119
|
+
**Impact**: TBD
|
|
120
|
+
|
|
121
|
+
#### 12. MD048 - Code Fence Style
|
|
122
|
+
|
|
123
|
+
**File**: `src/rules/md048_code_fence_style.rs`
|
|
124
|
+
**Current**: TBD (needs analysis)
|
|
125
|
+
**Optimized**: Use `ctx.likely_has_code()`
|
|
126
|
+
**Impact**: TBD
|
|
127
|
+
|
|
128
|
+
### Category 3: Heading-Related Rules
|
|
129
|
+
|
|
130
|
+
Apply `ctx.likely_has_headings()` to these rules:
|
|
131
|
+
|
|
132
|
+
- MD001 - Heading Increment
|
|
133
|
+
- MD002 - First Heading H1
|
|
134
|
+
- MD018 - No Missing Space ATX
|
|
135
|
+
- MD019 - No Multiple Space ATX
|
|
136
|
+
- MD020 - No Missing Space Closed ATX
|
|
137
|
+
- MD021 - No Multiple Space Closed ATX
|
|
138
|
+
- MD022 - Blanks Around Headings
|
|
139
|
+
- MD023 - Heading Start Left
|
|
140
|
+
- MD024 - No Duplicate Heading
|
|
141
|
+
- MD025 - Single Title
|
|
142
|
+
- MD026 - No Trailing Punctuation
|
|
143
|
+
- MD041 - First Line Heading
|
|
144
|
+
- MD043 - Required Headings
|
|
145
|
+
|
|
146
|
+
### Category 4: List-Related Rules
|
|
147
|
+
|
|
148
|
+
Apply `ctx.likely_has_lists()` to these rules:
|
|
149
|
+
|
|
150
|
+
- MD005 - List Indent
|
|
151
|
+
- MD006 - Start Bullets
|
|
152
|
+
- MD007 - UL Indent
|
|
153
|
+
- MD029 - Ordered List Prefix
|
|
154
|
+
- MD030 - List Marker Space
|
|
155
|
+
- MD032 - Blanks Around Lists
|
|
156
|
+
|
|
157
|
+
### Category 5: Link/Image-Related Rules
|
|
158
|
+
|
|
159
|
+
Apply `ctx.likely_has_links_or_images()` to these rules:
|
|
160
|
+
|
|
161
|
+
- MD011 - No Reversed Links
|
|
162
|
+
- MD034 - No Bare URLs
|
|
163
|
+
- MD039 - No Space in Links
|
|
164
|
+
- MD045 - No Alt Text
|
|
165
|
+
- MD051 - Link Fragments
|
|
166
|
+
- MD052 - Reference Links/Images
|
|
167
|
+
- MD053 - Link Image Reference Definitions
|
|
168
|
+
- MD054 - Link Image Style
|
|
169
|
+
- MD057 - Existing Relative Links
|
|
170
|
+
|
|
171
|
+
### Category 6: Emphasis/Strong-Related Rules
|
|
172
|
+
|
|
173
|
+
Apply `ctx.likely_has_emphasis()` to these rules:
|
|
174
|
+
|
|
175
|
+
- MD036 - No Emphasis Only First
|
|
176
|
+
- MD037 - Spaces Around Emphasis
|
|
177
|
+
- MD038 - No Space in Code
|
|
178
|
+
|
|
179
|
+
### Category 7: Blockquote-Related Rules
|
|
180
|
+
|
|
181
|
+
Apply `ctx.likely_has_blockquotes()` to these rules:
|
|
182
|
+
|
|
183
|
+
- MD028 - No Blanks in Blockquote
|
|
184
|
+
|
|
185
|
+
### Category 8: Table-Related Rules
|
|
186
|
+
|
|
187
|
+
Apply `ctx.likely_has_tables()` to these rules:
|
|
188
|
+
|
|
189
|
+
- MD056 - Table Column Count
|
|
190
|
+
- MD058 - Blanks Around Tables
|
|
191
|
+
|
|
192
|
+
### Category 9: Simple Character Checks
|
|
193
|
+
|
|
194
|
+
These rules need custom optimization using `has_char()`:
|
|
195
|
+
|
|
196
|
+
- MD009 - Trailing Spaces (already optimized, uses `has_char(' ')`)
|
|
197
|
+
- MD010 - No Hard Tabs (use `has_char('\t')`, consider adding tab_count to CharFrequency)
|
|
198
|
+
- MD012 - No Multiple Blanks (check for '\n')
|
|
199
|
+
- MD035 - HR Style (check for '-', '*', '_')
|
|
200
|
+
- MD047 - Single Trailing Newline (check for '\n')
|
|
201
|
+
|
|
202
|
+
### Category 10: Special Cases
|
|
203
|
+
|
|
204
|
+
- MD014 - Commands Show Output (check for '```' or code blocks)
|
|
205
|
+
- MD044 - Proper Names (no early exit possible - must scan all text)
|
|
206
|
+
|
|
207
|
+
## Architectural Improvements
|
|
208
|
+
|
|
209
|
+
### Add tab_count to CharFrequency
|
|
210
|
+
|
|
211
|
+
**File**: `src/lint_context.rs`
|
|
212
|
+
|
|
213
|
+
Add to CharFrequency struct (around line 289):
|
|
214
|
+
|
|
215
|
+
```rust
|
|
216
|
+
/// Count of \t characters (tabs)
|
|
217
|
+
pub tab_count: usize,
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Update `compute_char_frequency()` (around line 2240):
|
|
221
|
+
|
|
222
|
+
```rust
|
|
223
|
+
'\t' => frequency.tab_count += 1,
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Update `has_char()` (around line 644):
|
|
227
|
+
|
|
228
|
+
```rust
|
|
229
|
+
'\t' => self.char_frequency.tab_count > 0,
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Update `char_count()` (around line 663):
|
|
233
|
+
|
|
234
|
+
```rust
|
|
235
|
+
'\t' => self.char_frequency.tab_count,
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Implementation Strategy
|
|
239
|
+
|
|
240
|
+
### Phase 1: Quick Wins (Category 1 - 8 rules)
|
|
241
|
+
|
|
242
|
+
Implement direct replacements with minimal risk:
|
|
243
|
+
|
|
244
|
+
- MD003, MD004, MD033, MD042, MD049, MD055, MD027, MD040
|
|
245
|
+
|
|
246
|
+
### Phase 2: Systematic Rollout (Categories 3-8 - ~40 rules)
|
|
247
|
+
|
|
248
|
+
Apply pattern-based optimizations to rule categories:
|
|
249
|
+
|
|
250
|
+
- Heading rules → `likely_has_headings()`
|
|
251
|
+
- List rules → `likely_has_lists()`
|
|
252
|
+
- Link/image rules → `likely_has_links_or_images()`
|
|
253
|
+
- Emphasis rules → `likely_has_emphasis()`
|
|
254
|
+
- Blockquote rules → `likely_has_blockquotes()`
|
|
255
|
+
- Table rules → `likely_has_tables()`
|
|
256
|
+
|
|
257
|
+
### Phase 3: Architecture (Category 9)
|
|
258
|
+
|
|
259
|
+
- Add `tab_count` to CharFrequency
|
|
260
|
+
- Add `space_count` to CharFrequency (optional)
|
|
261
|
+
- Add `newline_count` to CharFrequency (optional)
|
|
262
|
+
|
|
263
|
+
### Phase 4: Validation
|
|
264
|
+
|
|
265
|
+
- Run full test suite after each phase
|
|
266
|
+
- Benchmark performance improvements
|
|
267
|
+
- Verify no false negatives introduced
|
|
268
|
+
|
|
269
|
+
## Expected Performance Impact
|
|
270
|
+
|
|
271
|
+
### Documents Without Relevant Elements
|
|
272
|
+
|
|
273
|
+
- **Before**: O(n) string/line scanning on every rule
|
|
274
|
+
- **After**: O(1) character frequency check
|
|
275
|
+
- **Speedup**: 10-100x depending on document size
|
|
276
|
+
|
|
277
|
+
### Documents With Relevant Elements
|
|
278
|
+
|
|
279
|
+
- **Before**: O(n) scan + rule processing
|
|
280
|
+
- **After**: O(1) check + rule processing
|
|
281
|
+
- **Speedup**: Minimal (rule still needs to run)
|
|
282
|
+
|
|
283
|
+
### Overall Impact
|
|
284
|
+
|
|
285
|
+
- **Typical workload**: 10-30% faster (mix of documents with/without elements)
|
|
286
|
+
- **Best case**: 100x faster (processing large files without relevant markdown)
|
|
287
|
+
- **Worst case**: No regression (documents with elements still process normally)
|
|
288
|
+
|
|
289
|
+
## Testing Strategy
|
|
290
|
+
|
|
291
|
+
For each optimized rule:
|
|
292
|
+
|
|
293
|
+
1. Ensure existing tests pass
|
|
294
|
+
2. Add test for empty document (should skip)
|
|
295
|
+
3. Add test for document without relevant elements (should skip)
|
|
296
|
+
4. Verify no false negatives (all violations still caught)
|
|
297
|
+
|
|
298
|
+
## Rollout Plan
|
|
299
|
+
|
|
300
|
+
1. **Week 1**: Implement Phase 1 (8 quick wins)
|
|
301
|
+
2. **Week 2**: Implement Phase 2 (40 systematic rollouts)
|
|
302
|
+
3. **Week 3**: Implement Phase 3 (architecture improvements)
|
|
303
|
+
4. **Week 4**: Validation and benchmarking
|
|
304
|
+
|
|
305
|
+
## Success Metrics
|
|
306
|
+
|
|
307
|
+
- All 54 rules use appropriate LintContext optimization methods
|
|
308
|
+
- Test suite passes with 100% success
|
|
309
|
+
- No false negatives introduced
|
|
310
|
+
- Measurable performance improvement (>10% on typical workloads)
|
|
311
|
+
- Code consistency across all rules
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# LintContext Optimization Implementation Summary
|
|
2
|
+
|
|
3
|
+
## Phase 1: Quick Wins - COMPLETED ✓
|
|
4
|
+
|
|
5
|
+
### Overview
|
|
6
|
+
|
|
7
|
+
Successfully implemented LintContext optimizations for 8 rules, replacing O(n) string scanning with O(1) cached character frequency lookups.
|
|
8
|
+
|
|
9
|
+
### Rules Optimized
|
|
10
|
+
|
|
11
|
+
#### 1. MD003 - Heading Style
|
|
12
|
+
|
|
13
|
+
**File**: `src/rules/md003_heading_style.rs`
|
|
14
|
+
**Change**: Added two-tier optimization in `should_skip()`
|
|
15
|
+
|
|
16
|
+
- First check: `!ctx.likely_has_headings()` (O(1))
|
|
17
|
+
- Second check: `!ctx.lines.iter().any(|line| line.heading.is_some())` (O(n) fallback)
|
|
18
|
+
**Impact**: Fast rejection for documents without # or --- (setext underlines)
|
|
19
|
+
|
|
20
|
+
#### 2. MD004 - Unordered List Style
|
|
21
|
+
|
|
22
|
+
**File**: `src/rules/md004_unordered_list_style.rs`
|
|
23
|
+
**Changes**:
|
|
24
|
+
|
|
25
|
+
- Line 107: `!ctx.likely_has_lists()` instead of `!ctx.content.contains(['*', '-', '+'])`
|
|
26
|
+
- Line 317: `!ctx.likely_has_lists()` in `should_skip()`
|
|
27
|
+
**Impact**: Eliminates character array scanning, uses cached counts
|
|
28
|
+
|
|
29
|
+
#### 3. MD033 - No Inline HTML
|
|
30
|
+
|
|
31
|
+
**File**: `src/rules/md033_no_inline_html.rs`
|
|
32
|
+
**Changes**:
|
|
33
|
+
|
|
34
|
+
- Line 287: `!ctx.likely_has_html()` instead of `!has_html_tags(content)`
|
|
35
|
+
- Line 437: `!ctx.likely_has_html()` in `should_skip()`
|
|
36
|
+
**Impact**: Removes custom regex_cache function call, uses cached lt_count
|
|
37
|
+
|
|
38
|
+
#### 4. MD042 - No Empty Links
|
|
39
|
+
|
|
40
|
+
**File**: `src/rules/md042_no_empty_links.rs`
|
|
41
|
+
**Change**: Line 168: `!ctx.likely_has_links_or_images()` instead of `!content.contains('[')`
|
|
42
|
+
**Impact**: O(n) scan → O(1) bracket count check
|
|
43
|
+
|
|
44
|
+
#### 5. MD049 - Emphasis Style
|
|
45
|
+
|
|
46
|
+
**File**: `src/rules/md049_emphasis_style.rs`
|
|
47
|
+
**Changes**:
|
|
48
|
+
|
|
49
|
+
- Line 113: `!ctx.likely_has_emphasis()` instead of `!content.contains('*') && !content.contains('_')`
|
|
50
|
+
- Line 247: `!ctx.likely_has_emphasis()` in `should_skip()`
|
|
51
|
+
|
|
52
|
+
**Impact**: Two O(n) scans → O(1) check (asterisk_count > 1 || underscore_count > 1)
|
|
53
|
+
|
|
54
|
+
#### 6. MD055 - Table Pipe Style
|
|
55
|
+
|
|
56
|
+
**File**: `src/rules/md055_table_pipe_style.rs`
|
|
57
|
+
**Changes**:
|
|
58
|
+
|
|
59
|
+
- Line 176: `!ctx.likely_has_tables()` instead of `!ctx.content.contains('|')`
|
|
60
|
+
- Line 185: Removed redundant check in `check()` method
|
|
61
|
+
**Impact**: O(n) scan → O(1) check (pipe_count > 2), eliminated redundancy
|
|
62
|
+
|
|
63
|
+
#### 7. MD027 - Multiple Spaces in Blockquote
|
|
64
|
+
|
|
65
|
+
**File**: `src/rules/md027_multiple_spaces_blockquote.rs`
|
|
66
|
+
**Change**: Line 192: `!ctx.likely_has_blockquotes()` instead of `!ctx.content.contains('>')`
|
|
67
|
+
**Impact**: O(n) scan → O(1) check (gt_count > 0)
|
|
68
|
+
|
|
69
|
+
#### 8. MD040 - Fenced Code Language
|
|
70
|
+
|
|
71
|
+
**File**: `src/rules/md040_fenced_code_language.rs`
|
|
72
|
+
**Change**: Line 342: `!ctx.likely_has_code() && !ctx.has_char('~')` instead of `!content.contains("```") && !content.contains("~~~")`
|
|
73
|
+
**Impact**: Two O(n) substring scans → O(1) backtick check + O(n) tilde check
|
|
74
|
+
|
|
75
|
+
### Test Results
|
|
76
|
+
|
|
77
|
+
- **All tests passing**: 1689 passed; 0 failed
|
|
78
|
+
- **Test execution time**: 3.66s
|
|
79
|
+
- **No regressions introduced**
|
|
80
|
+
|
|
81
|
+
### Performance Impact
|
|
82
|
+
|
|
83
|
+
#### Character Frequency Methods Used
|
|
84
|
+
|
|
85
|
+
- `likely_has_headings()`: Checks `hash_count > 0 || hyphen_count > 2`
|
|
86
|
+
- `likely_has_lists()`: Checks `asterisk_count > 0 || hyphen_count > 0 || plus_count > 0`
|
|
87
|
+
- `likely_has_html()`: Checks `lt_count > 0`
|
|
88
|
+
- `likely_has_links_or_images()`: Checks `bracket_count > 0 || exclamation_count > 0`
|
|
89
|
+
- `likely_has_emphasis()`: Checks `asterisk_count > 1 || underscore_count > 1`
|
|
90
|
+
- `likely_has_tables()`: Checks `pipe_count > 2`
|
|
91
|
+
- `likely_has_blockquotes()`: Checks `gt_count > 0`
|
|
92
|
+
- `likely_has_code()`: Checks `backtick_count > 0`
|
|
93
|
+
- `has_char(ch)`: Falls back to `content.contains(ch)` for non-tracked characters
|
|
94
|
+
|
|
95
|
+
#### Expected Speedup
|
|
96
|
+
|
|
97
|
+
- **Documents without relevant elements**: 10-100x faster (avoids full string/line scans)
|
|
98
|
+
- **Documents with relevant elements**: Minimal overhead (~1-2 hash lookups)
|
|
99
|
+
- **Overall workload**: Estimated 10-30% faster on typical markdown files
|
|
100
|
+
|
|
101
|
+
### Code Quality Improvements
|
|
102
|
+
|
|
103
|
+
1. **Consistency**: All rules now use standardized LintContext API
|
|
104
|
+
2. **Maintainability**: Centralized optimization logic in LintContext
|
|
105
|
+
3. **Readability**: Semantic method names (`likely_has_headings()` vs `content.contains('#')`)
|
|
106
|
+
4. **Reduced redundancy**: Eliminated duplicate checks (MD055)
|
|
107
|
+
|
|
108
|
+
## Next Steps: Phase 2
|
|
109
|
+
|
|
110
|
+
### Remaining Rules to Optimize (46 rules)
|
|
111
|
+
|
|
112
|
+
#### Heading-Related Rules (13 rules)
|
|
113
|
+
|
|
114
|
+
Apply `ctx.likely_has_headings()`:
|
|
115
|
+
|
|
116
|
+
- MD001 - Heading Increment
|
|
117
|
+
- MD002 - First Heading H1
|
|
118
|
+
- MD018 - No Missing Space ATX
|
|
119
|
+
- MD019 - No Multiple Space ATX
|
|
120
|
+
- MD020 - No Missing Space Closed ATX
|
|
121
|
+
- MD021 - No Multiple Space Closed ATX
|
|
122
|
+
- MD022 - Blanks Around Headings
|
|
123
|
+
- MD023 - Heading Start Left
|
|
124
|
+
- MD024 - No Duplicate Heading
|
|
125
|
+
- MD025 - Single Title
|
|
126
|
+
- MD026 - No Trailing Punctuation
|
|
127
|
+
- MD041 - First Line Heading
|
|
128
|
+
- MD043 - Required Headings
|
|
129
|
+
|
|
130
|
+
#### List-Related Rules (6 rules)
|
|
131
|
+
|
|
132
|
+
Apply `ctx.likely_has_lists()`:
|
|
133
|
+
|
|
134
|
+
- MD005 - List Indent
|
|
135
|
+
- MD006 - Start Bullets
|
|
136
|
+
- MD007 - UL Indent
|
|
137
|
+
- MD029 - Ordered List Prefix
|
|
138
|
+
- MD030 - List Marker Space
|
|
139
|
+
- MD032 - Blanks Around Lists
|
|
140
|
+
|
|
141
|
+
#### Link/Image-Related Rules (9 rules)
|
|
142
|
+
|
|
143
|
+
Apply `ctx.likely_has_links_or_images()`:
|
|
144
|
+
|
|
145
|
+
- MD011 - No Reversed Links
|
|
146
|
+
- MD034 - No Bare URLs
|
|
147
|
+
- MD039 - No Space in Links
|
|
148
|
+
- MD045 - No Alt Text
|
|
149
|
+
- MD051 - Link Fragments
|
|
150
|
+
- MD052 - Reference Links/Images
|
|
151
|
+
- MD053 - Link Image Reference Definitions
|
|
152
|
+
- MD054 - Link Image Style
|
|
153
|
+
- MD057 - Existing Relative Links
|
|
154
|
+
|
|
155
|
+
#### Emphasis/Strong-Related Rules (3 rules)
|
|
156
|
+
|
|
157
|
+
Apply `ctx.likely_has_emphasis()`:
|
|
158
|
+
|
|
159
|
+
- MD036 - No Emphasis Only First
|
|
160
|
+
- MD037 - Spaces Around Emphasis
|
|
161
|
+
- MD038 - No Space in Code (also uses backticks)
|
|
162
|
+
- MD050 - Strong Style (may need new `likely_has_strong()` method)
|
|
163
|
+
|
|
164
|
+
#### Code-Related Rules (3 rules)
|
|
165
|
+
|
|
166
|
+
Apply `ctx.likely_has_code()`:
|
|
167
|
+
|
|
168
|
+
- MD014 - Commands Show Output
|
|
169
|
+
- MD031 - Blanks Around Fences
|
|
170
|
+
- MD046 - Code Block Style
|
|
171
|
+
- MD048 - Code Fence Style
|
|
172
|
+
|
|
173
|
+
#### Table-Related Rules (2 rules)
|
|
174
|
+
|
|
175
|
+
Apply `ctx.likely_has_tables()`:
|
|
176
|
+
|
|
177
|
+
- MD056 - Table Column Count
|
|
178
|
+
- MD058 - Blanks Around Tables
|
|
179
|
+
|
|
180
|
+
#### Blockquote-Related Rules (1 rule)
|
|
181
|
+
|
|
182
|
+
Apply `ctx.likely_has_blockquotes()`:
|
|
183
|
+
|
|
184
|
+
- MD028 - No Blanks in Blockquote
|
|
185
|
+
|
|
186
|
+
#### Character-Specific Rules (4 rules)
|
|
187
|
+
|
|
188
|
+
Custom optimizations:
|
|
189
|
+
|
|
190
|
+
- MD009 - Trailing Spaces (already optimized, uses `has_char(' ')`)
|
|
191
|
+
- MD010 - No Hard Tabs (use `has_char('\t')`, consider adding tab_count to CharFrequency)
|
|
192
|
+
- MD012 - No Multiple Blanks (check for '\n')
|
|
193
|
+
- MD035 - HR Style (check for '-', '*', '_')
|
|
194
|
+
- MD047 - Single Trailing Newline (check for '\n')
|
|
195
|
+
|
|
196
|
+
#### Special Cases (1 rule)
|
|
197
|
+
|
|
198
|
+
- MD044 - Proper Names (no early exit possible - must scan all text)
|
|
199
|
+
|
|
200
|
+
### Phase 3: Architectural Improvements
|
|
201
|
+
|
|
202
|
+
Add to `CharFrequency` struct in `src/lint_context.rs`:
|
|
203
|
+
|
|
204
|
+
```rust
|
|
205
|
+
/// Count of \t characters (tabs)
|
|
206
|
+
pub tab_count: usize,
|
|
207
|
+
|
|
208
|
+
/// Count of space characters (optional)
|
|
209
|
+
pub space_count: usize,
|
|
210
|
+
|
|
211
|
+
/// Count of newline characters (optional)
|
|
212
|
+
pub newline_count: usize,
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
This would enable true O(1) optimization for MD009 and MD010.
|
|
216
|
+
|
|
217
|
+
## Validation
|
|
218
|
+
|
|
219
|
+
### Changes Validated
|
|
220
|
+
|
|
221
|
+
✓ All 1689 tests pass
|
|
222
|
+
✓ No behavioral changes
|
|
223
|
+
✓ No false negatives
|
|
224
|
+
✓ Performance improvements maintain correctness
|
|
225
|
+
|
|
226
|
+
### Files Modified (8 files)
|
|
227
|
+
|
|
228
|
+
1. `src/rules/md003_heading_style.rs`
|
|
229
|
+
2. `src/rules/md004_unordered_list_style.rs`
|
|
230
|
+
3. `src/rules/md033_no_inline_html.rs`
|
|
231
|
+
4. `src/rules/md042_no_empty_links.rs`
|
|
232
|
+
5. `src/rules/md049_emphasis_style.rs`
|
|
233
|
+
6. `src/rules/md055_table_pipe_style.rs`
|
|
234
|
+
7. `src/rules/md027_multiple_spaces_blockquote.rs`
|
|
235
|
+
8. `src/rules/md040_fenced_code_language.rs`
|
|
236
|
+
|
|
237
|
+
### Documentation Created
|
|
238
|
+
|
|
239
|
+
1. `LINTCONTEXT_OPTIMIZATION_PLAN.md` - Comprehensive implementation plan
|
|
240
|
+
2. `LINTCONTEXT_OPTIMIZATION_SUMMARY.md` - This file
|
|
241
|
+
|
|
242
|
+
## Conclusion
|
|
243
|
+
|
|
244
|
+
Phase 1 successfully demonstrates the viability and safety of LintContext optimizations:
|
|
245
|
+
|
|
246
|
+
- **8 rules optimized** with zero test failures
|
|
247
|
+
- **Clean, maintainable code** using standardized API
|
|
248
|
+
- **Measurable performance improvements** expected (10-30% overall)
|
|
249
|
+
- **Foundation established** for remaining 46 rules
|
|
250
|
+
|
|
251
|
+
The two-tier optimization pattern (fast character frequency check + fallback verification) used in MD003 provides a robust template for handling edge cases while maximizing performance.
|