rumdl 0.0.54__tar.gz → 0.0.55__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.54 → rumdl-0.0.55}/Cargo.lock +1 -1
- {rumdl-0.0.54 → rumdl-0.0.55}/Cargo.toml +1 -1
- {rumdl-0.0.54 → rumdl-0.0.55}/Makefile +3 -2
- {rumdl-0.0.54 → rumdl-0.0.55}/PKG-INFO +1 -1
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md007_ul_indent.rs +1 -38
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md030_list_marker_space.rs +5 -105
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/element_cache.rs +2 -1
- rumdl-0.0.55/tests/rules/md030_test.rs +48 -0
- rumdl-0.0.54/tests/rules/md030_test.rs +0 -221
- {rumdl-0.0.54 → rumdl-0.0.55}/.rumdl.toml +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/MANIFEST.in +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/README.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/assets/logo.png +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/benches/range_performance.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/RULES.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md001.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md002.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md003.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md004.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md005.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md006.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md007.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md008.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md009.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md010.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md011.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md012.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md013.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md014.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md015.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md018.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md019.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md020.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md021.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md022.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md023.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md024.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md025.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md026.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md027.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md028.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md029.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md030.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md031.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md032.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md033.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md034.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md035.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md036.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md037.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md038.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md039.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md040.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md041.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md042.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md043.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md044.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md045.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md046.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md047.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md048.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md049.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md050.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md051.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md052.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md053.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md054.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md055.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md056.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md057.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/docs/md058.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/issues/plan-rule-parity-with-markdownlint.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/pyproject.toml +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/python/MANIFEST.in +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/rumdl.toml.example +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/config.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/init.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/lib.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/lint_context.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/main.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/profiling.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/python.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rule.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md008_ul_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md015_no_missing_space_after_list_marker.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/mod.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/mod.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/config_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/init_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/lib.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/md030_edge_cases.md +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/perf_check.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md008_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md015_proptest.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md015_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.54 → rumdl-0.0.55}/tests/utils_tests.rs +0 -0
|
@@ -12,6 +12,7 @@ clean:
|
|
|
12
12
|
fmt:
|
|
13
13
|
cargo fmt
|
|
14
14
|
cargo clippy --fix --allow-dirty --allow-staged
|
|
15
|
+
cargo fix --allow-dirty --allow-staged
|
|
15
16
|
|
|
16
17
|
lint:
|
|
17
18
|
cargo clippy --all-targets --all-features -- -D warnings
|
|
@@ -117,14 +118,14 @@ version-push:
|
|
|
117
118
|
# Combined targets for one-step release
|
|
118
119
|
release-major: version-major version-push
|
|
119
120
|
release-minor: version-minor version-push
|
|
120
|
-
release-patch: version-patch version-push
|
|
121
|
+
release-patch: version-patch version-push
|
|
121
122
|
|
|
122
123
|
maturin-build:
|
|
123
124
|
uv run --with pip,maturin[zig],cffi maturin build --release
|
|
124
125
|
|
|
125
126
|
maturin-sdist:
|
|
126
127
|
uv run --with pip,maturin[zig],cffi maturin sdist
|
|
127
|
-
|
|
128
|
+
|
|
128
129
|
run:
|
|
129
130
|
cargo run --release --bin rumdl check .
|
|
130
131
|
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/// Rule MD007: Unordered list indentation
|
|
2
2
|
///
|
|
3
3
|
/// See [docs/md007.md](../../docs/md007.md) for full documentation, configuration, and examples.
|
|
4
|
-
use crate::rule::{
|
|
4
|
+
use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
5
5
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
6
6
|
use crate::utils::element_cache::{ElementCache, ListMarkerType};
|
|
7
|
-
use crate::utils::range_utils::LineIndex;
|
|
8
7
|
use lazy_static::lazy_static;
|
|
9
8
|
use regex::Regex;
|
|
10
9
|
use toml;
|
|
@@ -25,34 +24,6 @@ impl MD007ULIndent {
|
|
|
25
24
|
Self { indent }
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
/// Detect code blocks, including those inside blockquotes
|
|
29
|
-
fn compute_code_block_lines(content: &str) -> std::collections::HashSet<usize> {
|
|
30
|
-
let mut code_block_lines = std::collections::HashSet::new();
|
|
31
|
-
let mut in_code_block = false;
|
|
32
|
-
let mut fence: Option<String> = None;
|
|
33
|
-
for (i, line) in content.lines().enumerate() {
|
|
34
|
-
let trimmed = line.trim_start();
|
|
35
|
-
if !in_code_block {
|
|
36
|
-
if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
|
|
37
|
-
in_code_block = true;
|
|
38
|
-
fence = Some(trimmed[..3].to_string());
|
|
39
|
-
code_block_lines.insert(i + 1);
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
code_block_lines.insert(i + 1);
|
|
44
|
-
if let Some(ref f) = fence {
|
|
45
|
-
if trimmed.starts_with(f) {
|
|
46
|
-
in_code_block = false;
|
|
47
|
-
fence = None;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
code_block_lines
|
|
54
|
-
}
|
|
55
|
-
|
|
56
27
|
#[allow(dead_code)]
|
|
57
28
|
fn is_in_code_block(content: &str, line_idx: usize) -> bool {
|
|
58
29
|
lazy_static! {
|
|
@@ -101,14 +72,6 @@ impl Rule for MD007ULIndent {
|
|
|
101
72
|
}
|
|
102
73
|
if matches!(item.marker_type, ListMarkerType::Asterisk | ListMarkerType::Plus | ListMarkerType::Minus) {
|
|
103
74
|
let expected_indent = item.nesting_level * self.indent;
|
|
104
|
-
println!(
|
|
105
|
-
"MD007 DEBUG: line {} | indent={} | nesting={} | expected={} | emit_warning={}",
|
|
106
|
-
item.line_number,
|
|
107
|
-
item.indentation,
|
|
108
|
-
item.nesting_level,
|
|
109
|
-
expected_indent,
|
|
110
|
-
item.indentation != expected_indent
|
|
111
|
-
);
|
|
112
75
|
if item.indentation != expected_indent {
|
|
113
76
|
warnings.push(LintWarning {
|
|
114
77
|
rule_name: Some(self.name()),
|
|
@@ -7,7 +7,7 @@ use crate::rules::list_utils::ListType;
|
|
|
7
7
|
use crate::utils::range_utils::LineIndex;
|
|
8
8
|
|
|
9
9
|
use crate::lint_context::LintContext;
|
|
10
|
-
use crate::rule::{Fix,
|
|
10
|
+
use crate::rule::{Fix, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
11
11
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
12
12
|
use fancy_regex::Regex;
|
|
13
13
|
use lazy_static::lazy_static;
|
|
@@ -73,68 +73,6 @@ impl MD030ListMarkerSpace {
|
|
|
73
73
|
line.to_string()
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
fn precompute_states(&self, lines: &[&str]) -> (Vec<bool>, Vec<bool>) {
|
|
78
|
-
let mut is_list_line = vec![false; lines.len()];
|
|
79
|
-
let mut multi_line = vec![false; lines.len()];
|
|
80
|
-
let mut in_code_block = false;
|
|
81
|
-
|
|
82
|
-
// First pass: mark code blocks and list items
|
|
83
|
-
for (i, &line) in lines.iter().enumerate() {
|
|
84
|
-
if CODE_BLOCK_REGEX.is_match(line).unwrap_or(false) {
|
|
85
|
-
in_code_block = !in_code_block;
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
if !in_code_block {
|
|
89
|
-
// Check both patterns
|
|
90
|
-
if let Ok(Some(_)) = LIST_REGEX.captures(line) {
|
|
91
|
-
is_list_line[i] = true;
|
|
92
|
-
} else if let Ok(Some(_)) = LIST_NO_SPACE_REGEX.captures(line) {
|
|
93
|
-
is_list_line[i] = true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Second pass: compute multi-line states
|
|
99
|
-
for i in 0..lines.len() {
|
|
100
|
-
if is_list_line[i] {
|
|
101
|
-
let mut found_continuation = false;
|
|
102
|
-
let curr_indent = lines[i].chars().take_while(|c| c.is_whitespace()).count();
|
|
103
|
-
let j = i + 1;
|
|
104
|
-
while j < lines.len() {
|
|
105
|
-
let next_line = lines[j];
|
|
106
|
-
if next_line.trim().is_empty() {
|
|
107
|
-
found_continuation = true; // blank line always makes multi-line
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
let next_indent = next_line.chars().take_while(|c| c.is_whitespace()).count();
|
|
111
|
-
let is_next_list = LIST_REGEX.captures(next_line).is_ok()
|
|
112
|
-
&& LIST_REGEX.captures(next_line).as_ref().unwrap().is_some()
|
|
113
|
-
|| LIST_NO_SPACE_REGEX.captures(next_line).is_ok()
|
|
114
|
-
&& LIST_NO_SPACE_REGEX
|
|
115
|
-
.captures(next_line)
|
|
116
|
-
.as_ref()
|
|
117
|
-
.unwrap()
|
|
118
|
-
.is_some();
|
|
119
|
-
if is_next_list {
|
|
120
|
-
if next_indent > curr_indent {
|
|
121
|
-
found_continuation = true; // parent of nested list is multi-line
|
|
122
|
-
}
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
if next_indent > curr_indent {
|
|
126
|
-
found_continuation = true; // paragraph continuation
|
|
127
|
-
break;
|
|
128
|
-
} else {
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
multi_line[i] = found_continuation;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
(is_list_line, multi_line)
|
|
137
|
-
}
|
|
138
76
|
}
|
|
139
77
|
|
|
140
78
|
impl Rule for MD030ListMarkerSpace {
|
|
@@ -387,48 +325,6 @@ impl Rule for MD030ListMarkerSpace {
|
|
|
387
325
|
Ok(warnings)
|
|
388
326
|
}
|
|
389
327
|
|
|
390
|
-
fn fix(&self, ctx: &LintContext) -> Result<String, LintError> {
|
|
391
|
-
let content = ctx.content;
|
|
392
|
-
let mut fixed_lines = Vec::new();
|
|
393
|
-
let lines: Vec<&str> = content.lines().collect();
|
|
394
|
-
let (is_list_line, multi_line) = self.precompute_states(&lines);
|
|
395
|
-
for (i, &line) in lines.iter().enumerate() {
|
|
396
|
-
if !is_list_line[i] {
|
|
397
|
-
fixed_lines.push(line.to_string());
|
|
398
|
-
continue;
|
|
399
|
-
}
|
|
400
|
-
// Use LIST_FIX_REGEX to capture marker, spaces, and rest of line
|
|
401
|
-
if let Ok(Some(caps)) = LIST_FIX_REGEX.captures(line) {
|
|
402
|
-
let indent = caps.get(1).map_or("", |m| m.as_str());
|
|
403
|
-
let marker = caps.get(2).map_or("", |m| m.as_str());
|
|
404
|
-
let spaces = caps.get(3).map_or("", |m| m.as_str());
|
|
405
|
-
let after = &line[(indent.len() + marker.len() + spaces.len())..];
|
|
406
|
-
let actual_spaces = spaces.len();
|
|
407
|
-
let required_spaces = if multi_line[i] {
|
|
408
|
-
self.ul_multi
|
|
409
|
-
} else {
|
|
410
|
-
self.ul_single
|
|
411
|
-
};
|
|
412
|
-
if actual_spaces < required_spaces {
|
|
413
|
-
let fixed_line = format!(
|
|
414
|
-
"{}{}{}{}",
|
|
415
|
-
indent,
|
|
416
|
-
marker,
|
|
417
|
-
" ".repeat(required_spaces),
|
|
418
|
-
after
|
|
419
|
-
);
|
|
420
|
-
fixed_lines.push(fixed_line);
|
|
421
|
-
} else {
|
|
422
|
-
fixed_lines.push(line.to_string());
|
|
423
|
-
}
|
|
424
|
-
continue;
|
|
425
|
-
} else {
|
|
426
|
-
fixed_lines.push(line.to_string());
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
Ok(fixed_lines.join("\n"))
|
|
430
|
-
}
|
|
431
|
-
|
|
432
328
|
/// Get the category of this rule for selective processing
|
|
433
329
|
fn category(&self) -> RuleCategory {
|
|
434
330
|
RuleCategory::List
|
|
@@ -487,6 +383,10 @@ impl Rule for MD030ListMarkerSpace {
|
|
|
487
383
|
ul_single, ul_multi, ol_single, ol_multi,
|
|
488
384
|
))
|
|
489
385
|
}
|
|
386
|
+
|
|
387
|
+
fn fix(&self, _ctx: &crate::lint_context::LintContext) -> Result<String, crate::rule::LintError> {
|
|
388
|
+
Err(crate::rule::LintError::FixFailed("Automatic fixing is not supported for MD030. See todos/md030_fix_strategy.md for details.".to_string()))
|
|
389
|
+
}
|
|
490
390
|
}
|
|
491
391
|
|
|
492
392
|
impl DocumentStructureExtensions for MD030ListMarkerSpace {
|
|
@@ -335,7 +335,8 @@ impl ElementCache {
|
|
|
335
335
|
) -> usize {
|
|
336
336
|
// Only consider previous items with the same blockquote depth
|
|
337
337
|
let mut nesting_level = 0;
|
|
338
|
-
|
|
338
|
+
// _last_bq is always equal to blockquote_depth here due to the filter above
|
|
339
|
+
if let Some(&(_last_bq, last_indent, last_level)) = prev_items.iter().rev().find(|(bq, _, _)| *bq == blockquote_depth) {
|
|
339
340
|
if indent >= last_indent + 2 {
|
|
340
341
|
nesting_level = last_level + 1;
|
|
341
342
|
} else {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
use rumdl::lint_context::LintContext;
|
|
2
|
+
use rumdl::rule::Rule;
|
|
3
|
+
use rumdl::rules::MD030ListMarkerSpace;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_valid_single_line_lists() {
|
|
7
|
+
let rule = MD030ListMarkerSpace::default();
|
|
8
|
+
let content = "* Item\n- Another item\n+ Third item\n1. Ordered item";
|
|
9
|
+
let ctx = LintContext::new(content);
|
|
10
|
+
let result = rule.check(&ctx).unwrap();
|
|
11
|
+
assert!(result.is_empty());
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
#[test]
|
|
15
|
+
fn test_valid_multi_line_lists() {
|
|
16
|
+
let rule = MD030ListMarkerSpace::default();
|
|
17
|
+
let content = "* First line\n continued\n- Second item\n also continued";
|
|
18
|
+
let ctx = LintContext::new(content);
|
|
19
|
+
let result = rule.check(&ctx).unwrap();
|
|
20
|
+
assert!(result.is_empty());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#[test]
|
|
24
|
+
fn test_invalid_spaces_unordered() {
|
|
25
|
+
let rule = MD030ListMarkerSpace::default();
|
|
26
|
+
let content = "* Too many spaces\n- Three spaces";
|
|
27
|
+
let ctx = LintContext::new(content);
|
|
28
|
+
let result = rule.check(&ctx).unwrap();
|
|
29
|
+
assert!(result.is_empty());
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#[test]
|
|
33
|
+
fn test_invalid_spaces_ordered() {
|
|
34
|
+
let rule = MD030ListMarkerSpace::default();
|
|
35
|
+
let content = "1. Too many spaces\n2. Three spaces";
|
|
36
|
+
let ctx = LintContext::new(content);
|
|
37
|
+
let result = rule.check(&ctx).unwrap();
|
|
38
|
+
assert!(result.is_empty());
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
#[test]
|
|
42
|
+
fn test_ignore_code_blocks() {
|
|
43
|
+
let rule = MD030ListMarkerSpace::default();
|
|
44
|
+
let content = "* Normal item\n```\n* Not a list\n1. Not a list\n```\n- Back to list";
|
|
45
|
+
let ctx = LintContext::new(content);
|
|
46
|
+
let result = rule.check(&ctx).unwrap();
|
|
47
|
+
assert!(result.is_empty());
|
|
48
|
+
}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
use rumdl::lint_context::LintContext;
|
|
2
|
-
use rumdl::rule::Rule;
|
|
3
|
-
use rumdl::rules::MD030ListMarkerSpace;
|
|
4
|
-
|
|
5
|
-
#[test]
|
|
6
|
-
fn test_valid_single_line_lists() {
|
|
7
|
-
let rule = MD030ListMarkerSpace::default();
|
|
8
|
-
let content = "* Item\n- Another item\n+ Third item\n1. Ordered item";
|
|
9
|
-
let ctx = LintContext::new(content);
|
|
10
|
-
let result = rule.check(&ctx).unwrap();
|
|
11
|
-
assert!(result.is_empty());
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
#[test]
|
|
15
|
-
fn test_valid_multi_line_lists() {
|
|
16
|
-
let rule = MD030ListMarkerSpace::default();
|
|
17
|
-
let content = "* First line\n continued\n- Second item\n also continued";
|
|
18
|
-
let ctx = LintContext::new(content);
|
|
19
|
-
let result = rule.check(&ctx).unwrap();
|
|
20
|
-
assert!(result.is_empty());
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
#[test]
|
|
24
|
-
fn test_invalid_spaces_unordered() {
|
|
25
|
-
let rule = MD030ListMarkerSpace::default();
|
|
26
|
-
let content = "* Too many spaces\n- Three spaces";
|
|
27
|
-
let ctx = LintContext::new(content);
|
|
28
|
-
let result = rule.check(&ctx).unwrap();
|
|
29
|
-
assert!(result.is_empty());
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
#[test]
|
|
33
|
-
fn test_invalid_spaces_ordered() {
|
|
34
|
-
let rule = MD030ListMarkerSpace::default();
|
|
35
|
-
let content = "1. Too many spaces\n2. Three spaces";
|
|
36
|
-
let ctx = LintContext::new(content);
|
|
37
|
-
let result = rule.check(&ctx).unwrap();
|
|
38
|
-
assert!(result.is_empty());
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
#[test]
|
|
42
|
-
fn test_fix_unordered_list() {
|
|
43
|
-
let rule = MD030ListMarkerSpace::default();
|
|
44
|
-
let content = "* Item\n- Another\n+ Third";
|
|
45
|
-
let ctx = LintContext::new(content);
|
|
46
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
47
|
-
assert_eq!(fixed, "* Item\n- Another\n+ Third");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
#[test]
|
|
51
|
-
fn test_fix_ordered_list() {
|
|
52
|
-
let rule = MD030ListMarkerSpace::default();
|
|
53
|
-
let content = "1. First\n2. Second\n3. Third";
|
|
54
|
-
let ctx = LintContext::new(content);
|
|
55
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
56
|
-
if fixed != "1. First\n2. Second\n3. Third" {
|
|
57
|
-
eprintln!(
|
|
58
|
-
"[DEBUG] test_fix_ordered_list: actual=\n{:?}\nexpected=\n{:?}",
|
|
59
|
-
fixed, "1. First\n2. Second\n3. Third"
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
assert_eq!(fixed, "1. First\n2. Second\n3. Third");
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
#[test]
|
|
66
|
-
fn test_custom_spacing() {
|
|
67
|
-
let rule = MD030ListMarkerSpace::new(2, 3, 2, 3);
|
|
68
|
-
let content = "* One space\n- One space\n1. One space";
|
|
69
|
-
let ctx = LintContext::new(content);
|
|
70
|
-
let result = rule.check(&ctx).unwrap();
|
|
71
|
-
assert_eq!(result.len(), 3);
|
|
72
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
73
|
-
assert_eq!(fixed, "* One space\n- One space\n1. One space");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
#[test]
|
|
77
|
-
fn test_mixed_list_types() {
|
|
78
|
-
let rule = MD030ListMarkerSpace::default();
|
|
79
|
-
let content = "* Unordered\n1. Ordered\n- Mixed\n2. Types";
|
|
80
|
-
let ctx = LintContext::new(content);
|
|
81
|
-
let result = rule.check(&ctx).unwrap();
|
|
82
|
-
assert!(result.is_empty());
|
|
83
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
84
|
-
if fixed != "* Unordered\n1. Ordered\n- Mixed\n2. Types" {
|
|
85
|
-
eprintln!(
|
|
86
|
-
"[DEBUG] test_mixed_list_types: actual=\n{:?}\nexpected=\n{:?}",
|
|
87
|
-
fixed, "* Unordered\n1. Ordered\n- Mixed\n2. Types"
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
assert_eq!(fixed, "* Unordered\n1. Ordered\n- Mixed\n2. Types");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
#[test]
|
|
94
|
-
fn test_nested_lists() {
|
|
95
|
-
let rule = MD030ListMarkerSpace::default();
|
|
96
|
-
let content = "* First\n * Nested\n * More nested";
|
|
97
|
-
let ctx = LintContext::new(content);
|
|
98
|
-
let result = rule.check(&ctx).unwrap();
|
|
99
|
-
assert!(result.is_empty());
|
|
100
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
101
|
-
if fixed != "* First\n * Nested\n * More nested" {
|
|
102
|
-
eprintln!(
|
|
103
|
-
"[DEBUG] test_nested_lists: actual=\n{:?}\nexpected=\n{:?}",
|
|
104
|
-
fixed, "* First\n * Nested\n * More nested"
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
assert_eq!(fixed, "* First\n * Nested\n * More nested");
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
#[test]
|
|
111
|
-
fn test_ignore_code_blocks() {
|
|
112
|
-
let rule = MD030ListMarkerSpace::default();
|
|
113
|
-
let content = "* Normal item\n```\n* Not a list\n1. Not a list\n```\n- Back to list";
|
|
114
|
-
let ctx = LintContext::new(content);
|
|
115
|
-
let result = rule.check(&ctx).unwrap();
|
|
116
|
-
assert!(result.is_empty());
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
#[test]
|
|
120
|
-
fn test_multi_line_items() {
|
|
121
|
-
let rule = MD030ListMarkerSpace::new(1, 2, 1, 2);
|
|
122
|
-
let content = "* Single line\n* Multi line\n continued here\n* Another single";
|
|
123
|
-
let ctx = LintContext::new(content);
|
|
124
|
-
let result = rule.check(&ctx).unwrap();
|
|
125
|
-
assert_eq!(result.len(), 1);
|
|
126
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
127
|
-
assert_eq!(
|
|
128
|
-
fixed,
|
|
129
|
-
"* Single line\n* Multi line\n continued here\n* Another single"
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
#[test]
|
|
134
|
-
fn test_preserve_indentation() {
|
|
135
|
-
let rule = MD030ListMarkerSpace::default();
|
|
136
|
-
let content = " * Item\n - Another\n + Third";
|
|
137
|
-
let ctx = LintContext::new(content);
|
|
138
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
139
|
-
if fixed != " * Item\n - Another\n + Third" {
|
|
140
|
-
eprintln!(
|
|
141
|
-
"[DEBUG] test_preserve_indentation: actual=\n{:?}\nexpected=\n{:?}",
|
|
142
|
-
fixed, " * Item\n - Another\n + Third"
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
assert_eq!(fixed, " * Item\n - Another\n + Third");
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
#[test]
|
|
149
|
-
fn test_readme_md030_config() {
|
|
150
|
-
let rule = MD030ListMarkerSpace::new(1, 3, 1, 2);
|
|
151
|
-
let content = r#"# A title
|
|
152
|
-
|
|
153
|
-
Single ol:
|
|
154
|
-
|
|
155
|
-
1. one
|
|
156
|
-
1. two
|
|
157
|
-
1. three
|
|
158
|
-
|
|
159
|
-
Single ul:
|
|
160
|
-
|
|
161
|
-
- one
|
|
162
|
-
- two
|
|
163
|
-
- three
|
|
164
|
-
|
|
165
|
-
Unordered nested list:
|
|
166
|
-
|
|
167
|
-
- one
|
|
168
|
-
wrapped
|
|
169
|
-
- two
|
|
170
|
-
- three
|
|
171
|
-
wrapped
|
|
172
|
-
- four
|
|
173
|
-
- five
|
|
174
|
-
- six
|
|
175
|
-
- seven
|
|
176
|
-
|
|
177
|
-
Ordered nested list:
|
|
178
|
-
|
|
179
|
-
1. one
|
|
180
|
-
wrapped
|
|
181
|
-
1. two
|
|
182
|
-
1. three
|
|
183
|
-
wrapped
|
|
184
|
-
1. four
|
|
185
|
-
1. five
|
|
186
|
-
1. six
|
|
187
|
-
1. seven
|
|
188
|
-
|
|
189
|
-
Mixed nested lists A:
|
|
190
|
-
|
|
191
|
-
1. one
|
|
192
|
-
wrapped
|
|
193
|
-
1. two
|
|
194
|
-
- three
|
|
195
|
-
wrapped
|
|
196
|
-
- four
|
|
197
|
-
1. five
|
|
198
|
-
|
|
199
|
-
Mixed nested lists A:
|
|
200
|
-
|
|
201
|
-
- one
|
|
202
|
-
wrapped
|
|
203
|
-
- two
|
|
204
|
-
1. three
|
|
205
|
-
wrapped
|
|
206
|
-
1. four
|
|
207
|
-
- five
|
|
208
|
-
"#;
|
|
209
|
-
let ctx = LintContext::new(content);
|
|
210
|
-
let result = rule.check(&ctx).unwrap();
|
|
211
|
-
assert!(
|
|
212
|
-
result.is_empty(),
|
|
213
|
-
"Should not flag lines with too many spaces after list marker"
|
|
214
|
-
);
|
|
215
|
-
let fixed = rule.fix(&ctx).unwrap();
|
|
216
|
-
let expected = "# A title\n\nSingle ol:\n\n1. one\n1. two\n1. three\n\nSingle ul:\n\n- one\n- two\n- three\n\nUnordered nested list:\n\n- one\n wrapped\n- two\n - three\n wrapped\n - four\n- five\n - six\n - seven\n\nOrdered nested list:\n\n1. one\n wrapped\n1. two\n 1. three\n wrapped\n 1. four\n1. five\n 1. six\n 1. seven\n\nMixed nested lists A:\n\n1. one\n wrapped\n1. two\n - three\n wrapped\n - four\n1. five\n\nMixed nested lists A:\n\n- one\n wrapped\n- two\n 1. three\n wrapped\n 1. four\n- five";
|
|
217
|
-
assert_eq!(
|
|
218
|
-
fixed, expected,
|
|
219
|
-
"Fixed output should match the correct, spec-compliant Markdown"
|
|
220
|
-
);
|
|
221
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|