rumdl 0.0.135__tar.gz → 0.0.137__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.135 → rumdl-0.0.137}/CHANGELOG.md +12 -1
- {rumdl-0.0.135 → rumdl-0.0.137}/Cargo.lock +3 -3
- {rumdl-0.0.135 → rumdl-0.0.137}/Cargo.toml +1 -1
- {rumdl-0.0.135 → rumdl-0.0.137}/PKG-INFO +1 -1
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md009_trailing_spaces.rs +85 -12
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md013_line_length.rs +109 -47
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md034_no_bare_urls.rs +5 -2
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/github.rs +54 -9
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/text_reflow.rs +97 -9
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/comprehensive_output_format_tests.rs +3 -5
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md009_test.rs +15 -5
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md013_test.rs +4 -2
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_regression_prevention_test.rs +4 -4
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_test.rs +35 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md052_test.rs +25 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/.config/nextest.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/.mise.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/.rumdl.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/.rustfmt.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/LICENSE +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/MANIFEST.in +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/Makefile +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/README.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/assets/logo.png +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benches/range_performance.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/RULES.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/global-settings.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md001.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md002.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md003.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md004.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md005.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md006.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md007.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md009.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md010.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md011.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md012.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md013.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md014.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md018.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md019.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md020.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md021.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md022.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md023.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md024.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md025.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md026.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md027.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md028.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md029.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md030.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md031.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md032.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md033.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md034.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md035.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md036.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md037.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md038.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md039.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md040.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md041.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md042.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md043.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md044.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md045.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md046.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md047.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md048.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md049.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md050.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md051.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md052.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md053.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md054.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md055.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md056.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md057.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/md058.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/parity_check.py +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/pyproject.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/python/MANIFEST.in +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/rumdl.toml.example +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/rust-toolchain.toml +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/generate-downloads-table.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/pre-release.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/exit_codes.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/inline_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/lib.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/lint_context.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/server.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/types.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/main.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/output/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/parallel.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/performance.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/profiling.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/python.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rule.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rule_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/jekyll.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/kramdown.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/header_id_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/kramdown_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/line_ending.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_admonitions.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_common.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_critic.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_footnotes.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_patterns.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_snippets.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_tabs.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_test_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocstrings_refs.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/skip_context.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/src/vscode.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_upward_traversal_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/fixable_unfixable_config_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/init_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/kramdown_integration_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lib.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_formatting_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_initialization_options_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_mkdocs_flavor_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/md037_xxxx_regression_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/perf_check.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_dynamic_indent_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md026_kramdown_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md028_md009_interaction_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_code_block_separation_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_fix_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_issue42_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_kramdown_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md037_kramdown_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_comprehensive_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_issue_39_regression_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_property_based_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_unicode_security_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_admonitions_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_extensions_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_snippets_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/rule_interaction_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/skip_context_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/test_underscore_edge_cases.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/unfixable_rules_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.137] - 2025-09-04
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **MD051**: Fixed GitHub anchor generation for headers with arrow patterns (fixes #82)
|
|
14
|
+
- Headers like `WAL->L0 Compaction` now correctly generate `#wal-l0-compaction` anchors
|
|
15
|
+
- Arrow patterns (`->`, `-->`) now convert to the correct number of hyphens based on surrounding spaces
|
|
16
|
+
|
|
17
|
+
## [0.0.136] - 2025-09-03
|
|
18
|
+
|
|
10
19
|
## [0.0.135] - 2025-09-03
|
|
11
20
|
|
|
12
21
|
## [0.0.134] - 2025-09-02
|
|
@@ -560,7 +569,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
560
569
|
|
|
561
570
|
- Initial implementation of remaining rules for markdownlint parity
|
|
562
571
|
|
|
563
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
572
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.137...HEAD
|
|
573
|
+
[0.0.137]: https://github.com/rvben/rumdl/compare/v0.0.136...v0.0.137
|
|
574
|
+
[0.0.136]: https://github.com/rvben/rumdl/compare/v0.0.135...v0.0.136
|
|
564
575
|
[0.0.135]: https://github.com/rvben/rumdl/compare/v0.0.134...v0.0.135
|
|
565
576
|
[0.0.134]: https://github.com/rvben/rumdl/compare/v0.0.133...v0.0.134
|
|
566
577
|
[0.0.133]: https://github.com/rvben/rumdl/compare/v0.0.132...v0.0.133
|
|
@@ -1087,9 +1087,9 @@ dependencies = [
|
|
|
1087
1087
|
|
|
1088
1088
|
[[package]]
|
|
1089
1089
|
name = "log"
|
|
1090
|
-
version = "0.4.
|
|
1090
|
+
version = "0.4.28"
|
|
1091
1091
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1092
|
-
checksum = "
|
|
1092
|
+
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
|
|
1093
1093
|
|
|
1094
1094
|
[[package]]
|
|
1095
1095
|
name = "lsp-types"
|
|
@@ -1632,7 +1632,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
|
|
|
1632
1632
|
|
|
1633
1633
|
[[package]]
|
|
1634
1634
|
name = "rumdl"
|
|
1635
|
-
version = "0.0.
|
|
1635
|
+
version = "0.0.137"
|
|
1636
1636
|
dependencies = [
|
|
1637
1637
|
"anyhow",
|
|
1638
1638
|
"assert_cmd",
|
|
@@ -153,7 +153,10 @@ impl Rule for MD009TrailingSpaces {
|
|
|
153
153
|
trimmed.len() + 1,
|
|
154
154
|
trailing_spaces,
|
|
155
155
|
),
|
|
156
|
-
replacement: if !self.config.strict
|
|
156
|
+
replacement: if !self.config.strict
|
|
157
|
+
&& !is_truly_last_line
|
|
158
|
+
&& trailing_spaces == self.config.br_spaces
|
|
159
|
+
{
|
|
157
160
|
" ".repeat(self.config.br_spaces)
|
|
158
161
|
} else {
|
|
159
162
|
String::new()
|
|
@@ -236,11 +239,15 @@ impl Rule for MD009TrailingSpaces {
|
|
|
236
239
|
false
|
|
237
240
|
};
|
|
238
241
|
|
|
239
|
-
// In non-strict mode, preserve line breaks
|
|
242
|
+
// In non-strict mode, preserve line breaks ONLY if they have exactly br_spaces
|
|
240
243
|
// BUT: Never preserve trailing spaces in headings or empty blockquotes as they serve no purpose
|
|
241
|
-
if !self.config.strict
|
|
244
|
+
if !self.config.strict
|
|
245
|
+
&& !is_truly_last_line
|
|
246
|
+
&& trailing_spaces == self.config.br_spaces
|
|
247
|
+
&& !is_heading
|
|
248
|
+
&& !is_empty_blockquote
|
|
242
249
|
{
|
|
243
|
-
//
|
|
250
|
+
// Preserve the exact number of spaces for hard line breaks
|
|
244
251
|
match self.config.br_spaces {
|
|
245
252
|
0 => {}
|
|
246
253
|
1 => result.push(' '),
|
|
@@ -330,7 +337,10 @@ mod tests {
|
|
|
330
337
|
let content = "Line with spaces \nAnother line \nClean line";
|
|
331
338
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
332
339
|
let fixed = rule.fix(&ctx).unwrap();
|
|
333
|
-
|
|
340
|
+
// Line 1: 3 spaces -> removed (doesn't match br_spaces=2)
|
|
341
|
+
// Line 2: 2 spaces -> kept (matches br_spaces=2)
|
|
342
|
+
// Line 3: no spaces -> unchanged
|
|
343
|
+
assert_eq!(fixed, "Line with spaces\nAnother line \nClean line");
|
|
334
344
|
}
|
|
335
345
|
|
|
336
346
|
#[test]
|
|
@@ -366,19 +376,19 @@ mod tests {
|
|
|
366
376
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
367
377
|
let result = rule.check(&ctx).unwrap();
|
|
368
378
|
// br_spaces=2, so lines with exactly 2 spaces are OK
|
|
369
|
-
// Line 2 has 3 spaces (
|
|
379
|
+
// Line 2 has 3 spaces (should be removed, not normalized)
|
|
370
380
|
// Line 3 has 1 space and is last line without newline (will be removed)
|
|
371
381
|
assert_eq!(result.len(), 2);
|
|
372
382
|
assert_eq!(result[0].line, 2);
|
|
373
383
|
assert_eq!(result[1].line, 3);
|
|
374
384
|
|
|
375
385
|
let fixed = rule.fix(&ctx).unwrap();
|
|
376
|
-
// Line 1: keeps 2 spaces
|
|
377
|
-
// Line 2:
|
|
386
|
+
// Line 1: keeps 2 spaces (exact match with br_spaces)
|
|
387
|
+
// Line 2: removes all 3 spaces (doesn't match br_spaces)
|
|
378
388
|
// Line 3: last line without newline, spaces removed
|
|
379
389
|
assert_eq!(
|
|
380
390
|
fixed,
|
|
381
|
-
"Line with two spaces \nLine with three spaces
|
|
391
|
+
"Line with two spaces \nLine with three spaces\nLine with one space"
|
|
382
392
|
);
|
|
383
393
|
}
|
|
384
394
|
|
|
@@ -586,14 +596,16 @@ mod tests {
|
|
|
586
596
|
let content = "> > Nested \n> > \n> Normal ";
|
|
587
597
|
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
588
598
|
let result = rule.check(&ctx).unwrap();
|
|
589
|
-
// Line 2 has empty blockquote, line 3 is last line without newline
|
|
599
|
+
// Line 2 has empty blockquote with 3 spaces, line 3 is last line without newline
|
|
590
600
|
assert_eq!(result.len(), 2);
|
|
591
601
|
assert_eq!(result[0].line, 2);
|
|
592
602
|
assert_eq!(result[1].line, 3);
|
|
593
603
|
|
|
594
604
|
let fixed = rule.fix(&ctx).unwrap();
|
|
595
|
-
//
|
|
596
|
-
|
|
605
|
+
// Line 1: Keeps 2 spaces (exact match with br_spaces)
|
|
606
|
+
// Line 2: Empty blockquote with 3 spaces -> removes all (doesn't match br_spaces)
|
|
607
|
+
// Line 3: Last line without newline -> removes all spaces
|
|
608
|
+
assert_eq!(fixed, "> > Nested \n> >\n> Normal");
|
|
597
609
|
}
|
|
598
610
|
|
|
599
611
|
#[test]
|
|
@@ -608,4 +620,65 @@ mod tests {
|
|
|
608
620
|
assert_eq!(result.len(), 1);
|
|
609
621
|
assert_eq!(result[0].line, 2);
|
|
610
622
|
}
|
|
623
|
+
|
|
624
|
+
#[test]
|
|
625
|
+
fn test_issue_80_no_space_normalization() {
|
|
626
|
+
// Test for GitHub issue #80 - MD009 should not add spaces when removing trailing spaces
|
|
627
|
+
let rule = MD009TrailingSpaces::new(2, false); // br_spaces=2
|
|
628
|
+
|
|
629
|
+
// Test that 1 trailing space is removed, not normalized to 2
|
|
630
|
+
let content = "Line with one space \nNext line";
|
|
631
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
632
|
+
let result = rule.check(&ctx).unwrap();
|
|
633
|
+
assert_eq!(result.len(), 1);
|
|
634
|
+
assert_eq!(result[0].line, 1);
|
|
635
|
+
assert_eq!(result[0].message, "Trailing space found");
|
|
636
|
+
|
|
637
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
638
|
+
assert_eq!(fixed, "Line with one space\nNext line");
|
|
639
|
+
|
|
640
|
+
// Test that 3 trailing spaces are removed, not normalized to 2
|
|
641
|
+
let content = "Line with three spaces \nNext line";
|
|
642
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
643
|
+
let result = rule.check(&ctx).unwrap();
|
|
644
|
+
assert_eq!(result.len(), 1);
|
|
645
|
+
assert_eq!(result[0].line, 1);
|
|
646
|
+
assert_eq!(result[0].message, "3 trailing spaces found");
|
|
647
|
+
|
|
648
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
649
|
+
assert_eq!(fixed, "Line with three spaces\nNext line");
|
|
650
|
+
|
|
651
|
+
// Test that exactly 2 trailing spaces are preserved
|
|
652
|
+
let content = "Line with two spaces \nNext line";
|
|
653
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
654
|
+
let result = rule.check(&ctx).unwrap();
|
|
655
|
+
assert_eq!(result.len(), 0); // Should not flag lines with exact br_spaces
|
|
656
|
+
|
|
657
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
658
|
+
assert_eq!(fixed, "Line with two spaces \nNext line");
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
#[test]
|
|
662
|
+
fn test_different_br_spaces_values() {
|
|
663
|
+
// Test with br_spaces=0 (no trailing spaces allowed)
|
|
664
|
+
let rule = MD009TrailingSpaces::new(0, false);
|
|
665
|
+
let content = "Line with one space \nLine with two spaces ";
|
|
666
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
667
|
+
let result = rule.check(&ctx).unwrap();
|
|
668
|
+
assert_eq!(result.len(), 2); // Both lines should be flagged
|
|
669
|
+
|
|
670
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
671
|
+
assert_eq!(fixed, "Line with one space\nLine with two spaces");
|
|
672
|
+
|
|
673
|
+
// Test with br_spaces=1 (exactly 1 trailing space for line breaks)
|
|
674
|
+
let rule = MD009TrailingSpaces::new(1, false);
|
|
675
|
+
let content = "Line with one space \nLine with two spaces ";
|
|
676
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
677
|
+
let result = rule.check(&ctx).unwrap();
|
|
678
|
+
assert_eq!(result.len(), 1); // Only line 2 should be flagged
|
|
679
|
+
assert_eq!(result[0].line, 2);
|
|
680
|
+
|
|
681
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
682
|
+
assert_eq!(fixed, "Line with one space \nLine with two spaces");
|
|
683
|
+
}
|
|
611
684
|
}
|
|
@@ -8,6 +8,7 @@ use crate::utils::range_utils::calculate_excess_range;
|
|
|
8
8
|
use crate::utils::regex_cache::{
|
|
9
9
|
IMAGE_REF_PATTERN, INLINE_LINK_REGEX as MARKDOWN_LINK_PATTERN, LINK_REF_PATTERN, URL_IN_TEXT, URL_PATTERN,
|
|
10
10
|
};
|
|
11
|
+
use crate::utils::table_utils::TableUtils;
|
|
11
12
|
use toml;
|
|
12
13
|
|
|
13
14
|
pub mod md013_config;
|
|
@@ -36,24 +37,6 @@ impl MD013LineLength {
|
|
|
36
37
|
Self { config }
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
fn is_in_table(lines: &[&str], current_line: usize) -> bool {
|
|
40
|
-
// Check if current line is part of a table
|
|
41
|
-
let current = lines[current_line].trim();
|
|
42
|
-
if current.starts_with('|') || current.starts_with("|-") {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Check if line is between table markers
|
|
47
|
-
if current_line > 0 && current_line + 1 < lines.len() {
|
|
48
|
-
let prev = lines[current_line - 1].trim();
|
|
49
|
-
let next = lines[current_line + 1].trim();
|
|
50
|
-
if (prev.starts_with('|') || prev.starts_with("|-")) && (next.starts_with('|') || next.starts_with("|-")) {
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
false
|
|
55
|
-
}
|
|
56
|
-
|
|
57
40
|
fn should_ignore_line(
|
|
58
41
|
&self,
|
|
59
42
|
line: &str,
|
|
@@ -203,24 +186,21 @@ impl Rule for MD013LineLength {
|
|
|
203
186
|
// Create a quick lookup set for heading lines
|
|
204
187
|
let heading_lines_set: std::collections::HashSet<usize> = structure.heading_lines.iter().cloned().collect();
|
|
205
188
|
|
|
206
|
-
//
|
|
189
|
+
// Use TableUtils to find all table blocks in the document
|
|
190
|
+
let table_blocks = TableUtils::find_table_blocks(content, ctx);
|
|
191
|
+
|
|
192
|
+
// Pre-compute table lines from the table blocks
|
|
207
193
|
let table_lines_set: std::collections::HashSet<usize> = {
|
|
208
194
|
let mut table_lines = std::collections::HashSet::new();
|
|
209
195
|
|
|
210
|
-
for
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
} else {
|
|
219
|
-
structure.is_in_code_block(line_number)
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
if !in_code && Self::is_in_table(&lines, i) {
|
|
223
|
-
table_lines.insert(line_number);
|
|
196
|
+
for table in &table_blocks {
|
|
197
|
+
// Add header line
|
|
198
|
+
table_lines.insert(table.header_line + 1); // Convert 0-indexed to 1-indexed
|
|
199
|
+
// Add delimiter line
|
|
200
|
+
table_lines.insert(table.delimiter_line + 1);
|
|
201
|
+
// Add all content lines
|
|
202
|
+
for &line in &table.content_lines {
|
|
203
|
+
table_lines.insert(line + 1); // Convert 0-indexed to 1-indexed
|
|
224
204
|
}
|
|
225
205
|
}
|
|
226
206
|
table_lines
|
|
@@ -393,7 +373,8 @@ impl MD013LineLength {
|
|
|
393
373
|
}
|
|
394
374
|
|
|
395
375
|
// Skip tables (they have complex formatting)
|
|
396
|
-
if
|
|
376
|
+
// Check if line looks like a table row
|
|
377
|
+
if TableUtils::is_potential_table_row(line) {
|
|
397
378
|
return true;
|
|
398
379
|
}
|
|
399
380
|
|
|
@@ -568,19 +549,6 @@ mod tests {
|
|
|
568
549
|
assert_eq!(result.len(), 0);
|
|
569
550
|
}
|
|
570
551
|
|
|
571
|
-
#[test]
|
|
572
|
-
fn test_table_detection() {
|
|
573
|
-
let lines = vec![
|
|
574
|
-
"| Column 1 | Column 2 |",
|
|
575
|
-
"|----------|----------|",
|
|
576
|
-
"| Value 1 | Value 2 |",
|
|
577
|
-
];
|
|
578
|
-
|
|
579
|
-
assert!(MD013LineLength::is_in_table(&lines, 0));
|
|
580
|
-
assert!(MD013LineLength::is_in_table(&lines, 1));
|
|
581
|
-
assert!(MD013LineLength::is_in_table(&lines, 2));
|
|
582
|
-
}
|
|
583
|
-
|
|
584
552
|
#[test]
|
|
585
553
|
fn test_table_checked_when_enabled() {
|
|
586
554
|
let rule = MD013LineLength::new(30, false, true, false, false);
|
|
@@ -591,6 +559,74 @@ mod tests {
|
|
|
591
559
|
assert_eq!(result.len(), 2); // Both table lines exceed limit
|
|
592
560
|
}
|
|
593
561
|
|
|
562
|
+
#[test]
|
|
563
|
+
fn test_issue_78_tables_after_fenced_code_blocks() {
|
|
564
|
+
// Test for GitHub issue #78 - tables with tables=false after fenced code blocks
|
|
565
|
+
let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
|
|
566
|
+
let content = r#"# heading
|
|
567
|
+
|
|
568
|
+
```plain
|
|
569
|
+
some code block longer than 20 chars length
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
this is a very long line
|
|
573
|
+
|
|
574
|
+
| column A | column B |
|
|
575
|
+
| -------- | -------- |
|
|
576
|
+
| `var` | `val` |
|
|
577
|
+
| value 1 | value 2 |
|
|
578
|
+
|
|
579
|
+
correct length line"#;
|
|
580
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
581
|
+
let result = rule.check(&ctx).unwrap();
|
|
582
|
+
|
|
583
|
+
// Should only flag line 7 ("this is a very long line"), not the table lines
|
|
584
|
+
assert_eq!(result.len(), 1, "Should only flag 1 line (the non-table long line)");
|
|
585
|
+
assert_eq!(result[0].line, 7, "Should flag line 7");
|
|
586
|
+
assert!(result[0].message.contains("24 exceeds 20"));
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
#[test]
|
|
590
|
+
fn test_issue_78_tables_with_inline_code() {
|
|
591
|
+
// Test that tables with inline code (backticks) are properly detected as tables
|
|
592
|
+
let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
|
|
593
|
+
let content = r#"| column A | column B |
|
|
594
|
+
| -------- | -------- |
|
|
595
|
+
| `var with very long name` | `val exceeding limit` |
|
|
596
|
+
| value 1 | value 2 |
|
|
597
|
+
|
|
598
|
+
This line exceeds limit"#;
|
|
599
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
600
|
+
let result = rule.check(&ctx).unwrap();
|
|
601
|
+
|
|
602
|
+
// Should only flag the last line, not the table lines
|
|
603
|
+
assert_eq!(result.len(), 1, "Should only flag the non-table line");
|
|
604
|
+
assert_eq!(result[0].line, 6, "Should flag line 6");
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
#[test]
|
|
608
|
+
fn test_issue_78_indented_code_blocks() {
|
|
609
|
+
// Test with indented code blocks instead of fenced
|
|
610
|
+
let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
|
|
611
|
+
let content = r#"# heading
|
|
612
|
+
|
|
613
|
+
some code block longer than 20 chars length
|
|
614
|
+
|
|
615
|
+
this is a very long line
|
|
616
|
+
|
|
617
|
+
| column A | column B |
|
|
618
|
+
| -------- | -------- |
|
|
619
|
+
| value 1 | value 2 |
|
|
620
|
+
|
|
621
|
+
correct length line"#;
|
|
622
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
623
|
+
let result = rule.check(&ctx).unwrap();
|
|
624
|
+
|
|
625
|
+
// Should only flag line 5 ("this is a very long line"), not the table lines
|
|
626
|
+
assert_eq!(result.len(), 1, "Should only flag 1 line (the non-table long line)");
|
|
627
|
+
assert_eq!(result[0].line, 5, "Should flag line 5");
|
|
628
|
+
}
|
|
629
|
+
|
|
594
630
|
#[test]
|
|
595
631
|
fn test_url_exemption() {
|
|
596
632
|
let rule = MD013LineLength::new(30, false, false, false, false);
|
|
@@ -991,6 +1027,32 @@ And a bullet list:
|
|
|
991
1027
|
}
|
|
992
1028
|
}
|
|
993
1029
|
|
|
1030
|
+
#[test]
|
|
1031
|
+
fn test_issue_83_numbered_list_with_backticks() {
|
|
1032
|
+
// Test for issue #83: enable_reflow was incorrectly handling numbered lists
|
|
1033
|
+
let config = MD013Config {
|
|
1034
|
+
line_length: 100,
|
|
1035
|
+
reflow: true,
|
|
1036
|
+
..Default::default()
|
|
1037
|
+
};
|
|
1038
|
+
let rule = MD013LineLength::from_config_struct(config);
|
|
1039
|
+
|
|
1040
|
+
// The exact case from issue #83
|
|
1041
|
+
let content = "1. List `manifest` to find the manifest with the largest ID. Say it's `00000000000000000002.manifest` in this example.";
|
|
1042
|
+
let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
|
|
1043
|
+
|
|
1044
|
+
let fixed = rule.fix(&ctx).unwrap();
|
|
1045
|
+
|
|
1046
|
+
// The expected output: properly wrapped at 100 chars with correct list formatting
|
|
1047
|
+
// After the fix, it correctly accounts for "1. " (3 chars) leaving 97 for content
|
|
1048
|
+
let expected = "1. List `manifest` to find the manifest with the largest ID. Say it's\n `00000000000000000002.manifest` in this example.";
|
|
1049
|
+
|
|
1050
|
+
assert_eq!(
|
|
1051
|
+
fixed, expected,
|
|
1052
|
+
"List should be properly reflowed with correct marker and indentation.\nExpected:\n{expected}\nGot:\n{fixed}"
|
|
1053
|
+
);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
994
1056
|
#[test]
|
|
995
1057
|
fn test_text_reflow_disabled_by_default() {
|
|
996
1058
|
let rule = MD013LineLength::new(30, false, false, false, false);
|
|
@@ -769,9 +769,12 @@ mod tests {
|
|
|
769
769
|
);
|
|
770
770
|
|
|
771
771
|
// Performance assertion - should complete reasonably fast
|
|
772
|
+
// Note: In debug builds this may take longer, so we use a higher threshold
|
|
773
|
+
let max_duration_ms = if cfg!(debug_assertions) { 1000 } else { 100 };
|
|
772
774
|
assert!(
|
|
773
|
-
avg_check_duration.as_millis() <
|
|
774
|
-
"MD034 check should complete in under
|
|
775
|
+
avg_check_duration.as_millis() < max_duration_ms,
|
|
776
|
+
"MD034 check should complete in under {}ms, took {}ms",
|
|
777
|
+
max_duration_ms,
|
|
775
778
|
avg_check_duration.as_millis()
|
|
776
779
|
);
|
|
777
780
|
|
|
@@ -157,15 +157,33 @@ fn heading_to_fragment_internal(heading: &str) -> String {
|
|
|
157
157
|
|
|
158
158
|
// Step 6: Multi-character arrow patterns (order matters!)
|
|
159
159
|
// GitHub.com converts these patterns to specific hyphen sequences
|
|
160
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
text = text.replace("
|
|
166
|
-
text = text.replace("
|
|
167
|
-
text = text.replace("
|
|
168
|
-
text = text.replace("
|
|
160
|
+
// Verified against GitHub.com actual behavior (issue #82)
|
|
161
|
+
// Pattern: arrow itself becomes N hyphens, each adjacent space adds 1 more
|
|
162
|
+
// Must handle patterns with most spaces first to avoid partial replacements
|
|
163
|
+
|
|
164
|
+
// --> patterns (arrow = 2 hyphens base)
|
|
165
|
+
text = text.replace(" --> ", "----"); // 2 + 1 + 1 = 4 hyphens
|
|
166
|
+
text = text.replace(" -->", "---"); // 2 + 1 = 3 hyphens
|
|
167
|
+
text = text.replace("--> ", "---"); // 2 + 1 = 3 hyphens
|
|
168
|
+
text = text.replace("-->", "--"); // 2 hyphens
|
|
169
|
+
|
|
170
|
+
// <-> patterns (assuming similar pattern, needs verification)
|
|
171
|
+
text = text.replace(" <-> ", "---"); // estimated: 1 + 1 + 1 = 3 hyphens
|
|
172
|
+
text = text.replace(" <->", "--"); // estimated: 1 + 1 = 2 hyphens
|
|
173
|
+
text = text.replace("<-> ", "--"); // estimated: 1 + 1 = 2 hyphens
|
|
174
|
+
text = text.replace("<->", "-"); // estimated: 1 hyphen
|
|
175
|
+
|
|
176
|
+
// ==> patterns (assuming similar pattern, needs verification)
|
|
177
|
+
text = text.replace(" ==> ", "--"); // estimated pattern
|
|
178
|
+
text = text.replace(" ==>", "-"); // estimated pattern
|
|
179
|
+
text = text.replace("==> ", "-"); // estimated pattern
|
|
180
|
+
text = text.replace("==>", ""); // estimated: might be removed entirely
|
|
181
|
+
|
|
182
|
+
// -> patterns (arrow = 1 hyphen base)
|
|
183
|
+
text = text.replace(" -> ", "---"); // 1 + 1 + 1 = 3 hyphens
|
|
184
|
+
text = text.replace(" ->", "--"); // 1 + 1 = 2 hyphens
|
|
185
|
+
text = text.replace("-> ", "--"); // 1 + 1 = 2 hyphens
|
|
186
|
+
text = text.replace("->", "-"); // 1 hyphen
|
|
169
187
|
|
|
170
188
|
// Step 7: Remove problematic characters before symbol replacement
|
|
171
189
|
// First remove em-dashes and en-dashes entirely
|
|
@@ -899,6 +917,33 @@ mod tests {
|
|
|
899
917
|
assert_eq!(result, "cbrown----sbrown---unsafe-paths");
|
|
900
918
|
}
|
|
901
919
|
|
|
920
|
+
#[test]
|
|
921
|
+
fn test_github_arrow_patterns_issue_82() {
|
|
922
|
+
// Test cases for issue #82 - verified against GitHub.com actual behavior
|
|
923
|
+
// Pattern: arrow itself becomes N hyphens, each adjacent space adds 1 more
|
|
924
|
+
|
|
925
|
+
// Single arrow (->) patterns
|
|
926
|
+
assert_eq!(heading_to_fragment("WAL->L0 Compaction"), "wal-l0-compaction");
|
|
927
|
+
assert_eq!(heading_to_fragment("foo->bar->baz"), "foo-bar-baz");
|
|
928
|
+
assert_eq!(heading_to_fragment("a->b"), "a-b");
|
|
929
|
+
assert_eq!(heading_to_fragment("a ->b"), "a--b");
|
|
930
|
+
assert_eq!(heading_to_fragment("a-> b"), "a--b");
|
|
931
|
+
assert_eq!(heading_to_fragment("a -> b"), "a---b");
|
|
932
|
+
|
|
933
|
+
// Double arrow (-->) patterns
|
|
934
|
+
assert_eq!(heading_to_fragment("a-->b"), "a--b");
|
|
935
|
+
assert_eq!(heading_to_fragment("a -->b"), "a---b");
|
|
936
|
+
assert_eq!(heading_to_fragment("a--> b"), "a---b");
|
|
937
|
+
assert_eq!(heading_to_fragment("a --> b"), "a----b");
|
|
938
|
+
|
|
939
|
+
// Mixed patterns
|
|
940
|
+
assert_eq!(heading_to_fragment("cbrown -> sbrown"), "cbrown---sbrown");
|
|
941
|
+
assert_eq!(
|
|
942
|
+
heading_to_fragment("cbrown --> sbrown: --unsafe-paths"),
|
|
943
|
+
"cbrown----sbrown---unsafe-paths"
|
|
944
|
+
);
|
|
945
|
+
}
|
|
946
|
+
|
|
902
947
|
#[test]
|
|
903
948
|
fn test_security_performance_edge_cases() {
|
|
904
949
|
// Test performance with edge cases that could cause issues
|
|
@@ -629,20 +629,52 @@ pub fn reflow_markdown(content: &str, options: &ReflowOptions) -> String {
|
|
|
629
629
|
let indent = line.len() - line.trim_start().len();
|
|
630
630
|
let indent_str = " ".repeat(indent);
|
|
631
631
|
|
|
632
|
-
//
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
632
|
+
// For numbered lists, find the period and the space after it
|
|
633
|
+
// For bullet lists, find the marker and the space after it
|
|
634
|
+
let mut marker_end = indent;
|
|
635
|
+
let mut content_start = indent;
|
|
636
|
+
|
|
637
|
+
if trimmed.chars().next().is_some_and(|c| c.is_numeric()) {
|
|
638
|
+
// Numbered list: find the period
|
|
639
|
+
if let Some(period_pos) = line[indent..].find('.') {
|
|
640
|
+
marker_end = indent + period_pos + 1; // Include the period
|
|
641
|
+
content_start = marker_end;
|
|
642
|
+
// Skip any spaces after the period to find content start
|
|
643
|
+
while content_start < line.len() && line.chars().nth(content_start) == Some(' ') {
|
|
644
|
+
content_start += 1;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
} else {
|
|
648
|
+
// Bullet list: marker is single character
|
|
649
|
+
marker_end = indent + 1; // Just the marker character
|
|
650
|
+
content_start = marker_end;
|
|
651
|
+
// Skip any spaces after the marker
|
|
652
|
+
while content_start < line.len() && line.chars().nth(content_start) == Some(' ') {
|
|
653
|
+
content_start += 1;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
636
656
|
|
|
637
|
-
let marker = &line[indent..
|
|
638
|
-
let content = &line[content_start..]
|
|
657
|
+
let marker = &line[indent..marker_end];
|
|
658
|
+
let content = &line[content_start..];
|
|
639
659
|
|
|
640
660
|
// Calculate the proper indentation for continuation lines
|
|
641
661
|
// We need to align with the text after the marker
|
|
642
|
-
let trimmed_marker = marker
|
|
643
|
-
let continuation_spaces =
|
|
662
|
+
let trimmed_marker = marker;
|
|
663
|
+
let continuation_spaces = content_start; // Use the actual content start position
|
|
664
|
+
|
|
665
|
+
// CRITICAL: Adjust line length to account for list marker and space
|
|
666
|
+
// For the first line, we need to account for: indent + marker + space
|
|
667
|
+
// The format is: "{indent_str}{trimmed_marker} {content}"
|
|
668
|
+
// So available width = line_length - indent - marker_length - 1 (for space)
|
|
669
|
+
let prefix_length = indent + trimmed_marker.len() + 1; // +1 for space after marker
|
|
670
|
+
|
|
671
|
+
// Create adjusted options with reduced line length
|
|
672
|
+
let adjusted_options = ReflowOptions {
|
|
673
|
+
line_length: options.line_length.saturating_sub(prefix_length),
|
|
674
|
+
..options.clone()
|
|
675
|
+
};
|
|
644
676
|
|
|
645
|
-
let reflowed = reflow_line(content,
|
|
677
|
+
let reflowed = reflow_line(content, &adjusted_options);
|
|
646
678
|
for (j, reflowed_line) in reflowed.iter().enumerate() {
|
|
647
679
|
if j == 0 {
|
|
648
680
|
result.push(format!("{indent_str}{trimmed_marker} {reflowed_line}"));
|
|
@@ -1063,4 +1095,60 @@ mod tests {
|
|
|
1063
1095
|
}
|
|
1064
1096
|
}
|
|
1065
1097
|
}
|
|
1098
|
+
|
|
1099
|
+
#[test]
|
|
1100
|
+
fn test_reflow_markdown_numbered_lists() {
|
|
1101
|
+
// Test for issue #83: numbered lists with proper formatting
|
|
1102
|
+
let options = ReflowOptions {
|
|
1103
|
+
line_length: 50,
|
|
1104
|
+
..Default::default()
|
|
1105
|
+
};
|
|
1106
|
+
|
|
1107
|
+
let content = r#"1. List `manifest` to find the manifest with the largest ID. Say it's `00000000000000000002.manifest` in this example.
|
|
1108
|
+
2. Short item
|
|
1109
|
+
3. Another long item that definitely exceeds the fifty character limit and needs wrapping"#;
|
|
1110
|
+
|
|
1111
|
+
let result = reflow_markdown(content, &options);
|
|
1112
|
+
|
|
1113
|
+
// Define exact expected output
|
|
1114
|
+
let expected = r#"1. List `manifest` to find the manifest with the
|
|
1115
|
+
largest ID. Say it's
|
|
1116
|
+
`00000000000000000002.manifest` in this
|
|
1117
|
+
example.
|
|
1118
|
+
2. Short item
|
|
1119
|
+
3. Another long item that definitely exceeds the
|
|
1120
|
+
fifty character limit and needs wrapping"#;
|
|
1121
|
+
|
|
1122
|
+
assert_eq!(
|
|
1123
|
+
result, expected,
|
|
1124
|
+
"Numbered lists should be reflowed with proper markers and indentation.\nExpected:\n{expected}\nGot:\n{result}"
|
|
1125
|
+
);
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
#[test]
|
|
1129
|
+
fn test_reflow_markdown_bullet_lists() {
|
|
1130
|
+
let options = ReflowOptions {
|
|
1131
|
+
line_length: 40,
|
|
1132
|
+
..Default::default()
|
|
1133
|
+
};
|
|
1134
|
+
|
|
1135
|
+
let content = r#"- First bullet point with a very long line that needs wrapping
|
|
1136
|
+
* Second bullet using asterisk
|
|
1137
|
+
+ Third bullet using plus sign
|
|
1138
|
+
- Short one"#;
|
|
1139
|
+
|
|
1140
|
+
let result = reflow_markdown(content, &options);
|
|
1141
|
+
|
|
1142
|
+
// Define exact expected output - each bullet type preserved with proper indentation
|
|
1143
|
+
let expected = r#"- First bullet point with a very long
|
|
1144
|
+
line that needs wrapping
|
|
1145
|
+
* Second bullet using asterisk
|
|
1146
|
+
+ Third bullet using plus sign
|
|
1147
|
+
- Short one"#;
|
|
1148
|
+
|
|
1149
|
+
assert_eq!(
|
|
1150
|
+
result, expected,
|
|
1151
|
+
"Bullet lists should preserve markers and indent continuations with 2 spaces.\nExpected:\n{expected}\nGot:\n{result}"
|
|
1152
|
+
);
|
|
1153
|
+
}
|
|
1066
1154
|
}
|
|
@@ -250,11 +250,9 @@ fn test_output_format_with_fix_mode() {
|
|
|
250
250
|
|
|
251
251
|
// Verify the file was actually fixed
|
|
252
252
|
let fixed_content = fs::read_to_string(&test_file).unwrap();
|
|
253
|
-
//
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
"Trailing spaces should be normalized to 2 spaces"
|
|
257
|
-
);
|
|
253
|
+
// MD009 removes trailing spaces that don't match br_spaces (default 2)
|
|
254
|
+
// Since the content had 3 spaces, they should be removed
|
|
255
|
+
assert!(!fixed_content.contains(" "), "Trailing spaces (3) should be removed");
|
|
258
256
|
assert!(
|
|
259
257
|
fixed_content.contains("\n\n"),
|
|
260
258
|
"Blank line should be added after heading"
|