rumdl 0.0.66__tar.gz → 0.0.67__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.66 → rumdl-0.0.67}/Cargo.lock +1 -1
- {rumdl-0.0.66 → rumdl-0.0.67}/Cargo.toml +1 -1
- {rumdl-0.0.66 → rumdl-0.0.67}/PKG-INFO +1 -1
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md003_heading_style.rs +76 -134
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md007_ul_indent.rs +50 -72
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md013_line_length.rs +204 -40
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md030_list_marker_space.rs +167 -4
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md034_no_bare_urls.rs +40 -2
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md046_code_block_style.rs +9 -3
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md049_emphasis_style.rs +58 -53
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md053_link_image_reference_definitions.rs +52 -35
- rumdl-0.0.67/tests/rules/md030_test.rs +468 -0
- rumdl-0.0.66/tests/rules/md030_test.rs +0 -194
- {rumdl-0.0.66 → rumdl-0.0.67}/.rumdl.toml +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/MANIFEST.in +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/Makefile +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/README.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/assets/logo.png +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/benches/range_performance.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/RULES.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md001.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md002.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md003.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md004.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md005.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md006.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md007.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md009.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md010.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md011.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md012.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md013.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md014.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md018.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md019.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md020.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md021.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md022.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md023.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md024.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md025.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md026.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md027.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md028.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md029.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md030.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md031.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md032.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md033.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md034.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md035.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md036.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md037.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md038.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md039.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md040.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md041.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md042.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md043.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md044.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md045.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md046.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md047.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md048.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md049.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md050.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md051.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md052.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md053.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md054.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md055.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md056.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md057.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/docs/md058.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/issues/plan-rule-parity-with-markdownlint.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/parity_check.py +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/pyproject.toml +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/python/MANIFEST.in +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/rumdl.toml.example +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/config.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/init.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/lib.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/lint_context.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/server.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/types.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/main.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/profiling.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/python.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rule.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/mod.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/mod.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/config_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/init_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/lib.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/md030_edge_cases.md +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/perf_check.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils_tests.rs +0 -0
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
//! See [docs/md003.md](../../docs/md003.md) for full documentation, configuration, and examples.
|
|
5
5
|
|
|
6
6
|
use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
7
|
-
use crate::rules::heading_utils::
|
|
7
|
+
use crate::rules::heading_utils::HeadingStyle;
|
|
8
8
|
use crate::utils::document_structure::DocumentStructure;
|
|
9
|
-
use crate::utils::markdown_elements::{ElementQuality, ElementType, MarkdownElements};
|
|
10
9
|
use lazy_static::lazy_static;
|
|
11
10
|
use regex::Regex;
|
|
12
11
|
use std::str::FromStr;
|
|
@@ -166,143 +165,29 @@ impl Rule for MD003HeadingStyle {
|
|
|
166
165
|
}
|
|
167
166
|
|
|
168
167
|
fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
if content.is_empty() {
|
|
172
|
-
return Ok(String::new());
|
|
173
|
-
}
|
|
168
|
+
// Get all warnings with their fixes
|
|
169
|
+
let warnings = self.check(ctx)?;
|
|
174
170
|
|
|
175
|
-
//
|
|
176
|
-
if
|
|
177
|
-
return Ok(content.to_string());
|
|
171
|
+
// If no warnings, return original content
|
|
172
|
+
if warnings.is_empty() {
|
|
173
|
+
return Ok(ctx.content.to_string());
|
|
178
174
|
}
|
|
179
175
|
|
|
180
|
-
|
|
181
|
-
let mut
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if heading.element_type != ElementType::Heading
|
|
192
|
-
|| heading.quality != ElementQuality::Valid
|
|
193
|
-
{
|
|
194
|
-
continue; // Skip non-headings or invalid headings
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Add any lines before this heading
|
|
198
|
-
for i in last_processed_line..heading.start_line {
|
|
199
|
-
if !fixed_content.is_empty() {
|
|
200
|
-
fixed_content.push('\n');
|
|
201
|
-
}
|
|
202
|
-
fixed_content.push_str(lines.get(i).unwrap_or(&""));
|
|
176
|
+
// Collect all fixes and sort by range start (descending) to apply from end to beginning
|
|
177
|
+
let mut fixes: Vec<_> = warnings.iter()
|
|
178
|
+
.filter_map(|w| w.fix.as_ref().map(|f| (f.range.start, f.range.end, &f.replacement)))
|
|
179
|
+
.collect();
|
|
180
|
+
fixes.sort_by(|a, b| b.0.cmp(&a.0));
|
|
181
|
+
|
|
182
|
+
// Apply fixes from end to beginning to preserve byte offsets
|
|
183
|
+
let mut result = ctx.content.to_string();
|
|
184
|
+
for (start, end, replacement) in fixes {
|
|
185
|
+
if start < result.len() && end <= result.len() && start <= end {
|
|
186
|
+
result.replace_range(start..end, replacement);
|
|
203
187
|
}
|
|
204
|
-
|
|
205
|
-
// Get the heading level
|
|
206
|
-
if let Some(level_str) = &heading.metadata {
|
|
207
|
-
if let Ok(level) = level_str.parse::<u32>() {
|
|
208
|
-
// Determine the current style of the heading
|
|
209
|
-
let style = if heading.end_line > heading.start_line {
|
|
210
|
-
// Setext heading (has an underline)
|
|
211
|
-
if level == 1 {
|
|
212
|
-
HeadingStyle::Setext1
|
|
213
|
-
} else {
|
|
214
|
-
HeadingStyle::Setext2
|
|
215
|
-
}
|
|
216
|
-
} else {
|
|
217
|
-
// ATX heading
|
|
218
|
-
let line = lines.get(heading.start_line).map_or("", |v| *v);
|
|
219
|
-
if line.trim().ends_with('#') {
|
|
220
|
-
HeadingStyle::AtxClosed
|
|
221
|
-
} else {
|
|
222
|
-
HeadingStyle::Atx
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
// For markdownlint parity: when target style is Setext, all headings are expected to be Setext
|
|
227
|
-
// For level 3+, we can't actually convert to Setext, so leave as ATX but flag as violation
|
|
228
|
-
let expected_style = if target_style == HeadingStyle::Setext1
|
|
229
|
-
|| target_style == HeadingStyle::Setext2
|
|
230
|
-
{
|
|
231
|
-
if level > 2 {
|
|
232
|
-
// Level 3+ can't be Setext, so keep as ATX but this will be flagged as violation
|
|
233
|
-
HeadingStyle::Atx
|
|
234
|
-
} else if level == 1 {
|
|
235
|
-
HeadingStyle::Setext1
|
|
236
|
-
} else {
|
|
237
|
-
HeadingStyle::Setext2
|
|
238
|
-
}
|
|
239
|
-
} else {
|
|
240
|
-
target_style
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
// If this heading's style doesn't match the target, convert it
|
|
244
|
-
if style != expected_style {
|
|
245
|
-
// Get the text content from the heading
|
|
246
|
-
let text_content = if heading.end_line > heading.start_line {
|
|
247
|
-
// Setext heading
|
|
248
|
-
lines.get(heading.start_line).unwrap_or(&"").to_string()
|
|
249
|
-
} else {
|
|
250
|
-
// ATX heading
|
|
251
|
-
let line = lines.get(heading.start_line).map_or("", |v| *v);
|
|
252
|
-
HeadingUtils::get_heading_text(line).unwrap_or_default()
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
// Get indentation
|
|
256
|
-
let indentation = if let Some(line) = lines.get(heading.start_line) {
|
|
257
|
-
line.chars()
|
|
258
|
-
.take_while(|c| c.is_whitespace())
|
|
259
|
-
.collect::<String>()
|
|
260
|
-
} else {
|
|
261
|
-
String::new()
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
// Convert heading to target style
|
|
265
|
-
let converted_heading = HeadingUtils::convert_heading_style(
|
|
266
|
-
&format!("{}{}", indentation, text_content),
|
|
267
|
-
level,
|
|
268
|
-
expected_style,
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
// Add converted heading
|
|
272
|
-
if !fixed_content.is_empty() {
|
|
273
|
-
fixed_content.push('\n');
|
|
274
|
-
}
|
|
275
|
-
fixed_content.push_str(&converted_heading);
|
|
276
|
-
} else {
|
|
277
|
-
// Add original heading lines
|
|
278
|
-
for i in heading.start_line..=heading.end_line {
|
|
279
|
-
if !fixed_content.is_empty() {
|
|
280
|
-
fixed_content.push('\n');
|
|
281
|
-
}
|
|
282
|
-
fixed_content.push_str(lines.get(i).unwrap_or(&""));
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Update last processed line
|
|
287
|
-
last_processed_line = heading.end_line + 1;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Add any remaining lines
|
|
293
|
-
for i in last_processed_line..lines.len() {
|
|
294
|
-
if !fixed_content.is_empty() {
|
|
295
|
-
fixed_content.push('\n');
|
|
296
|
-
}
|
|
297
|
-
fixed_content.push_str(lines.get(i).unwrap_or(&""));
|
|
298
188
|
}
|
|
299
189
|
|
|
300
|
-
|
|
301
|
-
if content.ends_with('\n') && !fixed_content.ends_with('\n') {
|
|
302
|
-
fixed_content.push('\n');
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
Ok(fixed_content)
|
|
190
|
+
Ok(result)
|
|
306
191
|
}
|
|
307
192
|
|
|
308
193
|
fn check_with_structure(
|
|
@@ -383,6 +268,63 @@ impl Rule for MD003HeadingStyle {
|
|
|
383
268
|
};
|
|
384
269
|
|
|
385
270
|
if style != expected_style {
|
|
271
|
+
// Generate fix for this heading
|
|
272
|
+
let fix = {
|
|
273
|
+
use crate::rules::heading_utils::HeadingUtils;
|
|
274
|
+
|
|
275
|
+
// Get the text content from the heading
|
|
276
|
+
let text_content = if next_line_idx < lines.len() &&
|
|
277
|
+
(lines[next_line_idx].trim_start().starts_with('=') ||
|
|
278
|
+
lines[next_line_idx].trim_start().starts_with('-')) {
|
|
279
|
+
// Setext heading
|
|
280
|
+
current_line.to_string()
|
|
281
|
+
} else {
|
|
282
|
+
// ATX heading
|
|
283
|
+
HeadingUtils::get_heading_text(current_line).unwrap_or_default()
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// Get indentation
|
|
287
|
+
let indentation = current_line.chars()
|
|
288
|
+
.take_while(|c| c.is_whitespace())
|
|
289
|
+
.collect::<String>();
|
|
290
|
+
|
|
291
|
+
// Convert heading to target style
|
|
292
|
+
let converted_heading = HeadingUtils::convert_heading_style(
|
|
293
|
+
&format!("{}{}", indentation, text_content.trim()),
|
|
294
|
+
level as u32,
|
|
295
|
+
expected_style,
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
// Calculate the correct range for the heading
|
|
299
|
+
let line_index = crate::utils::range_utils::LineIndex::new(ctx.content.to_string());
|
|
300
|
+
let range = if next_line_idx < lines.len() &&
|
|
301
|
+
(lines[next_line_idx].trim_start().starts_with('=') ||
|
|
302
|
+
lines[next_line_idx].trim_start().starts_with('-')) {
|
|
303
|
+
// Setext heading spans two lines
|
|
304
|
+
let start_byte = line_index.line_col_to_byte_range(line_num, 1).start;
|
|
305
|
+
let end_byte = if line_num + 1 < lines.len() {
|
|
306
|
+
line_index.line_col_to_byte_range(line_num + 2, 1).start - 1
|
|
307
|
+
} else {
|
|
308
|
+
ctx.content.len()
|
|
309
|
+
};
|
|
310
|
+
start_byte..end_byte
|
|
311
|
+
} else {
|
|
312
|
+
// ATX heading is single line
|
|
313
|
+
let start_byte = line_index.line_col_to_byte_range(line_num, 1).start;
|
|
314
|
+
let end_byte = if line_num < lines.len() {
|
|
315
|
+
line_index.line_col_to_byte_range(line_num + 1, 1).start - 1
|
|
316
|
+
} else {
|
|
317
|
+
ctx.content.len()
|
|
318
|
+
};
|
|
319
|
+
start_byte..end_byte
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
Some(crate::rule::Fix {
|
|
323
|
+
range,
|
|
324
|
+
replacement: converted_heading,
|
|
325
|
+
})
|
|
326
|
+
};
|
|
327
|
+
|
|
386
328
|
result.push(LintWarning {
|
|
387
329
|
rule_name: Some(self.name()),
|
|
388
330
|
line: line_num, // Already 1-indexed
|
|
@@ -392,7 +334,7 @@ impl Rule for MD003HeadingStyle {
|
|
|
392
334
|
expected_style, style
|
|
393
335
|
),
|
|
394
336
|
severity: Severity::Warning,
|
|
395
|
-
fix
|
|
337
|
+
fix,
|
|
396
338
|
});
|
|
397
339
|
}
|
|
398
340
|
}
|
|
@@ -73,6 +73,38 @@ impl Rule for MD007ULIndent {
|
|
|
73
73
|
if matches!(item.marker_type, ListMarkerType::Asterisk | ListMarkerType::Plus | ListMarkerType::Minus) {
|
|
74
74
|
let expected_indent = item.nesting_level * self.indent;
|
|
75
75
|
if item.indentation != expected_indent {
|
|
76
|
+
// Generate fix for this list item
|
|
77
|
+
let fix = {
|
|
78
|
+
let lines: Vec<&str> = content.lines().collect();
|
|
79
|
+
if let Some(line) = lines.get(item.line_number - 1) {
|
|
80
|
+
// Extract the marker and content
|
|
81
|
+
let re = regex::Regex::new(r"^(\s*)([*+-])(\s+)(.*)$").unwrap();
|
|
82
|
+
if let Some(caps) = re.captures(line) {
|
|
83
|
+
let content_part = caps.get(4).map_or("", |m| m.as_str());
|
|
84
|
+
let space_after_marker = caps.get(3).map_or(" ", |m| m.as_str());
|
|
85
|
+
let marker_char = caps.get(2).map_or("*", |m| m.as_str());
|
|
86
|
+
let correct_indent = " ".repeat(expected_indent);
|
|
87
|
+
let fixed_line = format!("{}{}{}{}{}", item.blockquote_prefix, correct_indent, marker_char, space_after_marker, content_part);
|
|
88
|
+
|
|
89
|
+
let line_index = crate::utils::range_utils::LineIndex::new(content.to_string());
|
|
90
|
+
let line_start = line_index.line_col_to_byte_range(item.line_number, 1).start;
|
|
91
|
+
let line_end = if item.line_number < lines.len() {
|
|
92
|
+
line_index.line_col_to_byte_range(item.line_number + 1, 1).start - 1
|
|
93
|
+
} else {
|
|
94
|
+
content.len()
|
|
95
|
+
};
|
|
96
|
+
Some(crate::rule::Fix {
|
|
97
|
+
range: line_start..line_end,
|
|
98
|
+
replacement: fixed_line,
|
|
99
|
+
})
|
|
100
|
+
} else {
|
|
101
|
+
None
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
None
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
76
108
|
warnings.push(LintWarning {
|
|
77
109
|
rule_name: Some(self.name()),
|
|
78
110
|
message: format!(
|
|
@@ -82,7 +114,7 @@ impl Rule for MD007ULIndent {
|
|
|
82
114
|
line: item.line_number,
|
|
83
115
|
column: item.blockquote_prefix.len() + item.indentation + 1, // correct column for marker
|
|
84
116
|
severity: Severity::Warning,
|
|
85
|
-
fix
|
|
117
|
+
fix,
|
|
86
118
|
});
|
|
87
119
|
}
|
|
88
120
|
}
|
|
@@ -99,84 +131,30 @@ impl Rule for MD007ULIndent {
|
|
|
99
131
|
self.check(ctx)
|
|
100
132
|
}
|
|
101
133
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// Get the warnings to know which lines need indentation fixing
|
|
134
|
+
fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
|
|
135
|
+
// Get all warnings with their fixes
|
|
106
136
|
let warnings = self.check(ctx)?;
|
|
107
|
-
let mut lines_to_fix: std::collections::HashSet<usize> = std::collections::HashSet::new();
|
|
108
|
-
for warning in &warnings {
|
|
109
|
-
lines_to_fix.insert(warning.line);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
let element_cache = ElementCache::new(content);
|
|
113
|
-
let lines: Vec<&str> = content.lines().collect();
|
|
114
|
-
let mut result_lines: Vec<String> = Vec::new();
|
|
115
137
|
|
|
116
|
-
//
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if line.contains('\t') && element_cache.get_list_items().iter().any(|item| item.line_number == lines.iter().position(|&l| l == line).unwrap_or(0) + 1) {
|
|
120
|
-
has_tabs = true;
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// If no warnings and no tabs to normalize, return original content
|
|
126
|
-
if warnings.is_empty() && !has_tabs {
|
|
127
|
-
return Ok(content.to_string());
|
|
138
|
+
// If no warnings, return original content
|
|
139
|
+
if warnings.is_empty() {
|
|
140
|
+
return Ok(ctx.content.to_string());
|
|
128
141
|
}
|
|
129
142
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
let expected_indent = item.nesting_level * self.indent;
|
|
142
|
-
|
|
143
|
-
// Reconstruct the line with correct indentation
|
|
144
|
-
let marker_char = match item.marker_type {
|
|
145
|
-
ListMarkerType::Asterisk => '*',
|
|
146
|
-
ListMarkerType::Plus => '+',
|
|
147
|
-
ListMarkerType::Minus => '-',
|
|
148
|
-
_ => unreachable!(),
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
// Extract the content after the marker and space
|
|
152
|
-
let re = regex::Regex::new(r"^(\s*)([*+-])(\s+)(.*)$").unwrap();
|
|
153
|
-
if let Some(caps) = re.captures(line) {
|
|
154
|
-
let content_part = caps.get(4).map_or("", |m| m.as_str());
|
|
155
|
-
let space_after_marker = caps.get(3).map_or(" ", |m| m.as_str());
|
|
156
|
-
let correct_indent = " ".repeat(expected_indent);
|
|
157
|
-
let fixed_line = format!("{}{}{}{}{}", item.blockquote_prefix, correct_indent, marker_char, space_after_marker, content_part);
|
|
158
|
-
result_lines.push(fixed_line);
|
|
159
|
-
} else {
|
|
160
|
-
// Fallback: just use the original line
|
|
161
|
-
result_lines.push(line.to_string());
|
|
162
|
-
}
|
|
163
|
-
} else {
|
|
164
|
-
result_lines.push(line.to_string());
|
|
165
|
-
}
|
|
166
|
-
} else {
|
|
167
|
-
result_lines.push(line.to_string());
|
|
168
|
-
}
|
|
169
|
-
} else {
|
|
170
|
-
result_lines.push(line.to_string());
|
|
143
|
+
// Collect all fixes and sort by range start (descending) to apply from end to beginning
|
|
144
|
+
let mut fixes: Vec<_> = warnings.iter()
|
|
145
|
+
.filter_map(|w| w.fix.as_ref().map(|f| (f.range.start, f.range.end, &f.replacement)))
|
|
146
|
+
.collect();
|
|
147
|
+
fixes.sort_by(|a, b| b.0.cmp(&a.0));
|
|
148
|
+
|
|
149
|
+
// Apply fixes from end to beginning to preserve byte offsets
|
|
150
|
+
let mut result = ctx.content.to_string();
|
|
151
|
+
for (start, end, replacement) in fixes {
|
|
152
|
+
if start < result.len() && end <= result.len() && start <= end {
|
|
153
|
+
result.replace_range(start..end, replacement);
|
|
171
154
|
}
|
|
172
155
|
}
|
|
173
156
|
|
|
174
|
-
|
|
175
|
-
if content.ends_with('\n') {
|
|
176
|
-
Ok(result + "\n")
|
|
177
|
-
} else {
|
|
178
|
-
Ok(result)
|
|
179
|
-
}
|
|
157
|
+
Ok(result)
|
|
180
158
|
}
|
|
181
159
|
|
|
182
160
|
/// Get the category of this rule for selective processing
|