rumdl 0.0.89__tar.gz → 0.0.91__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.89 → rumdl-0.0.91}/.mise.toml +5 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/CHANGELOG.md +7 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/Cargo.lock +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/Cargo.toml +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/Makefile +62 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/PKG-INFO +11 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/README.md +10 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/benches/fix_performance.rs +35 -37
- {rumdl-0.0.89 → rumdl-0.0.91}/benches/range_performance.rs +9 -9
- {rumdl-0.0.89 → rumdl-0.0.91}/benches/range_utils_benchmark.rs +3 -3
- {rumdl-0.0.89 → rumdl-0.0.91}/benches/rule_performance.rs +11 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/benches/simple_fix_bench.rs +6 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/rust-toolchain.toml +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/benchmark.rs +4 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/file_parallel_benchmark.rs +9 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/measure_code_span_performance.rs +13 -13
- {rumdl-0.0.89 → rumdl-0.0.91}/src/config.rs +100 -109
- {rumdl-0.0.89 → rumdl-0.0.91}/src/init.rs +37 -35
- {rumdl-0.0.89 → rumdl-0.0.91}/src/lib.rs +62 -72
- {rumdl-0.0.89 → rumdl-0.0.91}/src/lint_context.rs +44 -384
- {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/mod.rs +47 -48
- {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/server.rs +58 -58
- {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/types.rs +14 -20
- {rumdl-0.0.89 → rumdl-0.0.91}/src/main.rs +112 -105
- {rumdl-0.0.89 → rumdl-0.0.91}/src/markdownlint_config.rs +141 -106
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/azure.rs +18 -18
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/concise.rs +19 -28
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/github.rs +16 -16
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/gitlab.rs +52 -43
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/grouped.rs +19 -18
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/json.rs +44 -41
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/json_lines.rs +36 -30
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/junit.rs +41 -40
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/pylint.rs +25 -41
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/sarif.rs +89 -64
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/text.rs +7 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/mod.rs +36 -31
- {rumdl-0.0.89 → rumdl-0.0.91}/src/parallel.rs +42 -30
- {rumdl-0.0.89 → rumdl-0.0.91}/src/performance.rs +28 -32
- {rumdl-0.0.89 → rumdl-0.0.91}/src/profiling.rs +36 -33
- {rumdl-0.0.89 → rumdl-0.0.91}/src/python.rs +26 -18
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rule.rs +63 -60
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rule_config.rs +13 -13
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rule_config_serde.rs +55 -43
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/blockquote_utils.rs +93 -48
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/code_block_utils.rs +45 -30
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/code_fence_utils.rs +21 -22
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/front_matter_utils.rs +123 -68
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/heading_utils.rs +67 -46
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/list_utils.rs +52 -47
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md001_heading_increment.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md002_first_heading_h1.rs +51 -31
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md003_heading_style/md003_config.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md003_heading_style.rs +3 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md004_unordered_list_style.rs +26 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md005_list_indent.rs +17 -16
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md006_start_bullets.rs +4 -7
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md007_ul_indent.rs +39 -42
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md009_trailing_spaces.rs +23 -16
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md010_no_hard_tabs.rs +13 -13
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md011_no_reversed_links.rs +4 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md012_no_multiple_blanks.rs +8 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md013_line_length.rs +11 -11
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md014_commands_show_output.rs +27 -19
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md019_no_multiple_space_atx.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md020_no_missing_space_closed_atx.rs +4 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md021_no_multiple_space_closed_atx.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md022_blanks_around_headings.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md023_heading_start_left.rs +3 -3
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md024_no_duplicate_heading.rs +11 -9
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md025_single_title.rs +14 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md026_no_trailing_punctuation.rs +16 -8
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md027_multiple_spaces_blockquote.rs +9 -9
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md028_no_blanks_blockquote.rs +5 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md029_ordered_list_prefix.rs +1 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md030_list_marker_space.rs +3 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md031_blanks_around_fences.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md032_blanks_around_lists.rs +15 -23
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md034_no_bare_urls.rs +17 -20
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md035_hr_style.rs +27 -27
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md036_no_emphasis_only_first.rs +44 -28
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md037_spaces_around_emphasis.rs +8 -253
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md038_no_space_in_code.rs +4 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md039_no_space_in_links.rs +16 -21
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md040_fenced_code_language.rs +27 -15
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md041_first_line_heading.rs +68 -40
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md042_no_empty_links.rs +22 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md043_required_headings.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md044_proper_names.rs +84 -95
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md045_no_alt_text.rs +31 -25
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md046_code_block_style/md046_config.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md046_code_block_style.rs +26 -26
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md048_code_fence_style/md048_config.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md048_code_fence_style.rs +21 -21
- rumdl-0.0.91/src/rules/md049_emphasis_style.rs +265 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md050_strong_style/md050_config.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md050_strong_style.rs +44 -30
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md051_link_fragments.rs +61 -45
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md052_reference_links_images.rs +38 -38
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md053_link_image_reference_definitions.rs +26 -32
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md054_link_image_style.rs +25 -26
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md055_table_pipe_style/md055_config.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md055_table_pipe_style.rs +3 -7
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md056_table_column_count.rs +25 -25
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md057_existing_relative_links.rs +1 -3
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md058_blanks_around_tables.rs +21 -21
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/strong_style.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/ast_utils.rs +55 -59
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/code_block_utils.rs +15 -14
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/document_structure.rs +16 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/early_returns.rs +52 -52
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/element_cache.rs +0 -8
- rumdl-0.0.91/src/utils/emphasis_utils.rs +374 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/fix_utils.rs +15 -16
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/mod.rs +2 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/regex_cache.rs +33 -37
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/table_utils.rs +48 -48
- {rumdl-0.0.89 → rumdl-0.0.91}/src/vscode.rs +33 -32
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/advanced_integration_tests.rs +4 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/additional_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/basic_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/comprehensive_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/extended_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_integration_tests.rs +30 -39
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_lsp_fix_consistency.rs +46 -54
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_statistics_test.rs +8 -17
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/commonmark_compliance_tests.rs +5 -8
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/comprehensive_integration_tests.rs +11 -11
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_application_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_tests.rs +16 -30
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/configuration_inheritance_tests.rs +4 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/cross_platform_compatibility_tests.rs +22 -25
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/final_confidence_assessment.rs +5 -8
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/init_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_editor_integration_tests.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_integration_tests.rs +6 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_memory_leak_tests.rs +28 -32
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/malformed_markdown_stress_tests.rs +2 -7
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlint_cli_integration.rs +6 -9
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlint_config_test.rs +3 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/output_format_tests.rs +29 -38
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/perf_check.rs +5 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/performance_validation_tests.rs +5 -8
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/pyproject_config_tests.rs +9 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/real_world_repository_tests.rs +4 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/regression_prevention_tests.rs +8 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md002_test.rs +73 -58
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md004_test.rs +27 -18
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md006_test.rs +2 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md007_test.rs +50 -53
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md009_test.rs +2 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md010_test.rs +60 -36
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md012_test.rs +9 -9
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md013_test.rs +43 -25
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md014_test.rs +33 -13
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md022_test.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md023_extended_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md024_test.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md025_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md026_test.rs +75 -44
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md029_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md030_test.rs +5 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md032_test.rs +6 -8
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md034_test.rs +26 -32
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md037_test.rs +6 -7
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md041_test.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md044_test.rs +3 -3
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md045_test.rs +8 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md046_test.rs +6 -4
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md051_test.rs +23 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md052_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_additional_test.rs +10 -12
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/thread_safety_tests.rs +8 -10
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/unicode_edge_case_tests.rs +2 -6
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/code_block_utils_extended_test.rs +5 -5
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/code_block_utils_test.rs +3 -3
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/line_index_test.rs +2 -2
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils_markdown_edge_cases.rs +13 -14
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils_tests.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/vscode_extension_fixes.rs +22 -46
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/vscode_test.rs +2 -2
- rumdl-0.0.89/src/rules/md049_emphasis_style.rs +0 -278
- {rumdl-0.0.89 → rumdl-0.0.91}/.config/nextest.toml +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/.rumdl.toml +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/.rustfmt.toml +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/LICENSE +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/MANIFEST.in +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/assets/logo.png +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/RULES.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/global-settings.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md001.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md002.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md003.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md004.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md005.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md006.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md007.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md009.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md010.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md011.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md012.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md013.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md014.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md018.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md019.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md020.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md021.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md022.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md023.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md024.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md025.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md026.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md027.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md028.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md029.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md030.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md031.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md032.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md033.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md034.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md035.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md036.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md037.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md038.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md039.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md040.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md041.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md042.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md043.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md044.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md045.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md046.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md047.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md048.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md049.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md050.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md051.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md052.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md053.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md054.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md055.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md056.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md057.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/md058.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/issues/plan-rule-parity-with-markdownlint.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/parity_check.py +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/pyproject.toml +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/python/MANIFEST.in +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/rumdl.toml.example +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/inline_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/mod.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/lib.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/md030_edge_cases.md +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md003_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md048_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md049_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md050_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/core_utils_test.rs +1 -1
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/mod.rs +0 -0
|
@@ -7,7 +7,7 @@ RUST_BACKTRACE = "1"
|
|
|
7
7
|
|
|
8
8
|
[tools]
|
|
9
9
|
# Rust toolchain - version matches rust-toolchain.toml
|
|
10
|
-
rust = "1.
|
|
10
|
+
rust = "1.88.0"
|
|
11
11
|
|
|
12
12
|
# Python for maturin/python bindings
|
|
13
13
|
python = "3.12"
|
|
@@ -24,10 +24,10 @@ uv = "latest"
|
|
|
24
24
|
# Zig for cross-compilation (used by maturin)
|
|
25
25
|
zig = "0.13"
|
|
26
26
|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
#
|
|
27
|
+
# Additional Rust development tools for dependency management
|
|
28
|
+
"cargo:cargo-edit" = "latest" # For cargo add/rm/upgrade commands
|
|
29
|
+
"cargo:cargo-outdated" = "latest" # Check for outdated dependencies
|
|
30
|
+
# Optional: Security and dependency tools
|
|
31
31
|
# "cargo:cargo-audit" = "latest" # Security audit dependencies
|
|
32
32
|
# "cargo:cargo-deny" = "latest" # Lint dependencies
|
|
33
33
|
|
|
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.91] - 2025-07-02
|
|
11
|
+
|
|
12
|
+
## [0.0.90] - 2025-07-01
|
|
13
|
+
|
|
10
14
|
## [0.0.89] - 2025-07-01
|
|
11
15
|
|
|
12
16
|
### Added
|
|
@@ -107,7 +111,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
107
111
|
### Added
|
|
108
112
|
- Initial implementation of remaining rules for markdownlint parity
|
|
109
113
|
|
|
110
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
114
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.91...HEAD
|
|
115
|
+
[0.0.91]: https://github.com/rvben/rumdl/compare/v0.0.90...v0.0.91
|
|
116
|
+
[0.0.90]: https://github.com/rvben/rumdl/compare/v0.0.89...v0.0.90
|
|
111
117
|
[0.0.89]: https://github.com/rvben/rumdl/compare/v0.0.88...v0.0.89
|
|
112
118
|
[0.0.88]: https://github.com/rvben/rumdl/compare/v0.0.87...v0.0.88
|
|
113
119
|
[0.0.87]: https://github.com/rvben/rumdl/compare/v0.0.86...v0.0.87
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.91"
|
|
4
4
|
edition = "2024"
|
|
5
|
-
rust-version = "1.
|
|
5
|
+
rust-version = "1.88.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
7
7
|
authors = ["Ruben J. Jongejan <ruben.jongejan@gmail.com>"]
|
|
8
8
|
license = "MIT"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: build test clean fmt check doc version-major version-minor version-patch build-python build-wheel dev-install setup-mise dev-setup dev-verify
|
|
1
|
+
.PHONY: build test clean fmt check doc version-major version-minor version-patch build-python build-wheel dev-install setup-mise dev-setup dev-verify update-dependencies update-rust-version pre-release
|
|
2
2
|
|
|
3
3
|
# Development environment setup
|
|
4
4
|
setup-mise:
|
|
@@ -248,3 +248,64 @@ trigger-pre-commit:
|
|
|
248
248
|
-H "Authorization: Bearer $(PRECOMMIT_DISPATCH_TOKEN)" \
|
|
249
249
|
https://api.github.com/repos/rvben/rumdl-pre-commit/dispatches \
|
|
250
250
|
-d '{"event_type": "pypi_release"}'
|
|
251
|
+
|
|
252
|
+
# Dependency and version update targets
|
|
253
|
+
update-dependencies:
|
|
254
|
+
@echo "Updating Cargo dependencies to latest compatible versions..."
|
|
255
|
+
@cargo update
|
|
256
|
+
@echo "Dependencies updated in Cargo.lock"
|
|
257
|
+
@echo ""
|
|
258
|
+
@if command -v cargo-outdated >/dev/null 2>&1; then \
|
|
259
|
+
echo "Checking for available updates beyond current constraints:"; \
|
|
260
|
+
cargo outdated; \
|
|
261
|
+
else \
|
|
262
|
+
echo "Install cargo-outdated for more detailed update information:"; \
|
|
263
|
+
echo " cargo install cargo-outdated"; \
|
|
264
|
+
fi
|
|
265
|
+
|
|
266
|
+
update-rust-version:
|
|
267
|
+
@echo "Checking for latest stable Rust version..."
|
|
268
|
+
$(eval LATEST_RUST := $(shell curl -s https://api.github.com/repos/rust-lang/rust/releases/latest | grep '"tag_name":' | sed -E 's/.*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/' | head -1))
|
|
269
|
+
$(eval CURRENT_RUST := $(shell grep '^rust-version' Cargo.toml | sed -E 's/rust-version = "([0-9]+\.[0-9]+\.[0-9]+)"/\1/'))
|
|
270
|
+
@if [ -z "$(LATEST_RUST)" ]; then \
|
|
271
|
+
echo "Failed to fetch latest Rust version"; \
|
|
272
|
+
exit 1; \
|
|
273
|
+
fi
|
|
274
|
+
@echo "Current Rust version: $(CURRENT_RUST)"
|
|
275
|
+
@echo "Latest Rust version: $(LATEST_RUST)"
|
|
276
|
+
@if [ "$(CURRENT_RUST)" = "$(LATEST_RUST)" ]; then \
|
|
277
|
+
echo "Already using the latest Rust version"; \
|
|
278
|
+
else \
|
|
279
|
+
echo "Updating Rust version to $(LATEST_RUST)..."; \
|
|
280
|
+
sed -i.bak -E 's/^rust-version = "[0-9]+\.[0-9]+\.[0-9]+"/rust-version = "$(LATEST_RUST)"/' Cargo.toml; \
|
|
281
|
+
sed -i.bak -E 's/^rust = "[0-9]+\.[0-9]+\.[0-9]+"/rust = "$(LATEST_RUST)"/' .mise.toml; \
|
|
282
|
+
sed -i.bak -E 's/^channel = "[0-9]+\.[0-9]+\.[0-9]+"/channel = "$(LATEST_RUST)"/' rust-toolchain.toml; \
|
|
283
|
+
rm -f Cargo.toml.bak .mise.toml.bak rust-toolchain.toml.bak; \
|
|
284
|
+
echo "Updated Rust version in Cargo.toml, .mise.toml, and rust-toolchain.toml"; \
|
|
285
|
+
echo "Running 'cargo check' to verify compatibility..."; \
|
|
286
|
+
cargo check || (echo "Warning: cargo check failed. You may need to fix compatibility issues."; exit 1); \
|
|
287
|
+
fi
|
|
288
|
+
|
|
289
|
+
pre-release:
|
|
290
|
+
@echo "Preparing for release..."
|
|
291
|
+
@echo "===================="
|
|
292
|
+
@$(MAKE) update-rust-version
|
|
293
|
+
@echo ""
|
|
294
|
+
@$(MAKE) update-dependencies
|
|
295
|
+
@echo ""
|
|
296
|
+
@echo "Running tests to verify everything works..."
|
|
297
|
+
@$(MAKE) test-quick
|
|
298
|
+
@echo ""
|
|
299
|
+
@echo "Pre-release preparation complete!"
|
|
300
|
+
@echo "===================="
|
|
301
|
+
@echo ""
|
|
302
|
+
@echo "Summary of changes:"
|
|
303
|
+
@echo "- Rust version: $$(grep '^rust-version' Cargo.toml | sed -E 's/rust-version = "([0-9]+\.[0-9]+\.[0-9]+)"/\1/')"
|
|
304
|
+
@echo "- Dependencies: Updated to latest compatible versions"
|
|
305
|
+
@echo ""
|
|
306
|
+
@echo "Please review changes and commit if satisfied."
|
|
307
|
+
|
|
308
|
+
# Full release targets that include pre-release preparation
|
|
309
|
+
release-major-full: pre-release version-major version-push
|
|
310
|
+
release-minor-full: pre-release version-minor version-push
|
|
311
|
+
release-patch-full: pre-release version-patch version-push
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rumdl
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.91
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -55,6 +55,7 @@ Project-URL: Repository, https://github.com/rvben/rumdl.git
|
|
|
55
55
|
- [Table of Contents](#table-of-contents)
|
|
56
56
|
- [Quick Start](#quick-start)
|
|
57
57
|
- [Overview](#overview)
|
|
58
|
+
- [Performance](#performance)
|
|
58
59
|
- [Installation](#installation)
|
|
59
60
|
- [Using Cargo (Rust)](#using-cargo-rust)
|
|
60
61
|
- [Using pip (Python)](#using-pip-python)
|
|
@@ -102,7 +103,7 @@ rumdl init
|
|
|
102
103
|
|
|
103
104
|
rumdl is a high-performance Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. It offers:
|
|
104
105
|
|
|
105
|
-
- ⚡️ **Built for speed** with Rust
|
|
106
|
+
- ⚡️ **Built for speed** with Rust - significantly faster than alternatives
|
|
106
107
|
- 🔍 **54 lint rules** covering common Markdown issues
|
|
107
108
|
- 🛠️ **Automatic fixing** with `--fix` for most rules
|
|
108
109
|
- 📦 **Zero dependencies** - single binary with no runtime requirements
|
|
@@ -112,6 +113,14 @@ rumdl is a high-performance Markdown linter and fixer that helps ensure consiste
|
|
|
112
113
|
- 📏 **Modern CLI** with detailed error reporting
|
|
113
114
|
- 🔄 **CI/CD friendly** with non-zero exit code on errors
|
|
114
115
|
|
|
116
|
+
## Performance
|
|
117
|
+
|
|
118
|
+
rumdl is designed for speed and efficiency:
|
|
119
|
+
|
|
120
|
+

|
|
121
|
+
|
|
122
|
+
rumdl is **4.3x faster** on average than markdownlint for typical markdown files, with performance improvements ranging from 3.4x to 5.4x depending on project size.
|
|
123
|
+
|
|
115
124
|
## Installation
|
|
116
125
|
|
|
117
126
|
Choose the installation method that works best for you:
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
- [Table of Contents](#table-of-contents)
|
|
25
25
|
- [Quick Start](#quick-start)
|
|
26
26
|
- [Overview](#overview)
|
|
27
|
+
- [Performance](#performance)
|
|
27
28
|
- [Installation](#installation)
|
|
28
29
|
- [Using Cargo (Rust)](#using-cargo-rust)
|
|
29
30
|
- [Using pip (Python)](#using-pip-python)
|
|
@@ -71,7 +72,7 @@ rumdl init
|
|
|
71
72
|
|
|
72
73
|
rumdl is a high-performance Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. It offers:
|
|
73
74
|
|
|
74
|
-
- ⚡️ **Built for speed** with Rust
|
|
75
|
+
- ⚡️ **Built for speed** with Rust - significantly faster than alternatives
|
|
75
76
|
- 🔍 **54 lint rules** covering common Markdown issues
|
|
76
77
|
- 🛠️ **Automatic fixing** with `--fix` for most rules
|
|
77
78
|
- 📦 **Zero dependencies** - single binary with no runtime requirements
|
|
@@ -81,6 +82,14 @@ rumdl is a high-performance Markdown linter and fixer that helps ensure consiste
|
|
|
81
82
|
- 📏 **Modern CLI** with detailed error reporting
|
|
82
83
|
- 🔄 **CI/CD friendly** with non-zero exit code on errors
|
|
83
84
|
|
|
85
|
+
## Performance
|
|
86
|
+
|
|
87
|
+
rumdl is designed for speed and efficiency:
|
|
88
|
+
|
|
89
|
+

|
|
90
|
+
|
|
91
|
+
rumdl is **4.3x faster** on average than markdownlint for typical markdown files, with performance improvements ranging from 3.4x to 5.4x depending on project size.
|
|
92
|
+
|
|
84
93
|
## Installation
|
|
85
94
|
|
|
86
95
|
Choose the installation method that works best for you:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use criterion::{black_box, criterion_group, criterion_main
|
|
1
|
+
use criterion::{Criterion, black_box, criterion_group, criterion_main};
|
|
2
2
|
use rumdl::lint_context::LintContext;
|
|
3
3
|
use rumdl::rule::Rule;
|
|
4
4
|
use rumdl::rules::*;
|
|
@@ -10,7 +10,7 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
10
10
|
for i in 0..size {
|
|
11
11
|
// MD001 - Heading increment issues
|
|
12
12
|
if i % 10 == 0 {
|
|
13
|
-
content.push_str(&format!("### Heading {} (should be H1)\n\n"
|
|
13
|
+
content.push_str(&format!("### Heading {i} (should be H1)\n\n"));
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
// MD002 - First heading should be H1
|
|
@@ -20,40 +20,40 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
20
20
|
|
|
21
21
|
// MD003 - Heading style inconsistency
|
|
22
22
|
if i % 15 == 0 {
|
|
23
|
-
content.push_str(&format!("Heading {}\n"
|
|
23
|
+
content.push_str(&format!("Heading {i}\n"));
|
|
24
24
|
content.push_str("=============\n\n");
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// MD004 - Unordered list style inconsistency
|
|
28
28
|
if i % 8 == 0 {
|
|
29
|
-
content.push_str(&format!("* Item {}\n"
|
|
29
|
+
content.push_str(&format!("* Item {i}\n"));
|
|
30
30
|
content.push_str(&format!("- Item {}\n", i + 1));
|
|
31
31
|
content.push_str(&format!("+ Item {}\n\n", i + 2));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// MD005 - List indentation issues
|
|
35
35
|
if i % 12 == 0 {
|
|
36
|
-
content.push_str(&format!("* Item {}\n"
|
|
37
|
-
content.push_str(&format!(" * Badly indented item {}\n\n"
|
|
36
|
+
content.push_str(&format!("* Item {i}\n"));
|
|
37
|
+
content.push_str(&format!(" * Badly indented item {i}\n\n"));
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// MD006 - Start bullets at beginning
|
|
41
41
|
if i % 20 == 0 {
|
|
42
|
-
content.push_str(&format!(" * Indented bullet {}\n\n"
|
|
42
|
+
content.push_str(&format!(" * Indented bullet {i}\n\n"));
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
// MD007 - Unordered list indentation
|
|
46
46
|
if i % 18 == 0 {
|
|
47
|
-
content.push_str(&format!("* Item {}\n"
|
|
48
|
-
content.push_str(&format!(" * Wrong indent {}\n\n"
|
|
47
|
+
content.push_str(&format!("* Item {i}\n"));
|
|
48
|
+
content.push_str(&format!(" * Wrong indent {i}\n\n"));
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
// MD009 - Trailing spaces
|
|
52
|
-
content.push_str(&format!("Line {} with trailing spaces \n"
|
|
52
|
+
content.push_str(&format!("Line {i} with trailing spaces \n"));
|
|
53
53
|
|
|
54
54
|
// MD010 - Hard tabs
|
|
55
55
|
if i % 25 == 0 {
|
|
56
|
-
content.push_str(&format!("Line {}\twith\ttabs\n"
|
|
56
|
+
content.push_str(&format!("Line {i}\twith\ttabs\n"));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// MD012 - Multiple blank lines
|
|
@@ -63,72 +63,72 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
63
63
|
|
|
64
64
|
// MD013 - Line length (create long lines)
|
|
65
65
|
if i % 7 == 0 {
|
|
66
|
-
content.push_str(&format!("This is a very long line {} that exceeds the default line length limit of 80 characters and should be flagged by MD013 rule for being too long.\n"
|
|
66
|
+
content.push_str(&format!("This is a very long line {i} that exceeds the default line length limit of 80 characters and should be flagged by MD013 rule for being too long.\n"));
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
// MD018 - No space after hash on atx heading
|
|
70
70
|
if i % 22 == 0 {
|
|
71
|
-
content.push_str(&format!("#Heading without space {}\n\n"
|
|
71
|
+
content.push_str(&format!("#Heading without space {i}\n\n"));
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
// MD019 - Multiple spaces after hash on atx heading
|
|
75
75
|
if i % 24 == 0 {
|
|
76
|
-
content.push_str(&format!("## Heading with extra spaces {}\n\n"
|
|
76
|
+
content.push_str(&format!("## Heading with extra spaces {i}\n\n"));
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
// MD020 - No space inside hashes on closed atx heading
|
|
80
80
|
if i % 26 == 0 {
|
|
81
|
-
content.push_str(&format!("#Closed heading{}#\n\n"
|
|
81
|
+
content.push_str(&format!("#Closed heading{i}#\n\n"));
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
// MD021 - Multiple spaces inside hashes on closed atx heading
|
|
85
85
|
if i % 28 == 0 {
|
|
86
|
-
content.push_str(&format!("# Closed heading {} #\n\n"
|
|
86
|
+
content.push_str(&format!("# Closed heading {i} #\n\n"));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
// MD022 - Headings should be surrounded by blank lines
|
|
90
90
|
if i % 35 == 0 {
|
|
91
|
-
content.push_str(&format!("Text before heading\n# Heading {}\nText after heading\n\n"
|
|
91
|
+
content.push_str(&format!("Text before heading\n# Heading {i}\nText after heading\n\n"));
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
// MD023 - Headings must start at beginning of line
|
|
95
95
|
if i % 40 == 0 {
|
|
96
|
-
content.push_str(&format!(" # Indented heading {}\n\n"
|
|
96
|
+
content.push_str(&format!(" # Indented heading {i}\n\n"));
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
// MD026 - Trailing punctuation in headings
|
|
100
100
|
if i % 16 == 0 {
|
|
101
|
-
content.push_str(&format!("# Heading with punctuation {}!\n\n"
|
|
101
|
+
content.push_str(&format!("# Heading with punctuation {i}!\n\n"));
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
// MD027 - Multiple spaces after blockquote symbol
|
|
105
105
|
if i % 45 == 0 {
|
|
106
|
-
content.push_str(&format!("> Blockquote with extra spaces {}\n\n"
|
|
106
|
+
content.push_str(&format!("> Blockquote with extra spaces {i}\n\n"));
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// MD030 - Spaces after list markers
|
|
110
110
|
if i % 14 == 0 {
|
|
111
|
-
content.push_str(&format!("- Item with extra space {}\n\n"
|
|
111
|
+
content.push_str(&format!("- Item with extra space {i}\n\n"));
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
// MD031 - Fenced code blocks should be surrounded by blank lines
|
|
115
115
|
if i % 50 == 0 {
|
|
116
|
-
content.push_str(&format!("Text before\n```\ncode {}\n```\nText after\n\n"
|
|
116
|
+
content.push_str(&format!("Text before\n```\ncode {i}\n```\nText after\n\n"));
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
// MD032 - Lists should be surrounded by blank lines
|
|
120
120
|
if i % 55 == 0 {
|
|
121
|
-
content.push_str(&format!("Text before\n* List item {}\nText after\n\n"
|
|
121
|
+
content.push_str(&format!("Text before\n* List item {i}\nText after\n\n"));
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
// MD033 - Inline HTML
|
|
125
125
|
if i % 17 == 0 {
|
|
126
|
-
content.push_str(&format!("Text with <b>HTML tags</b> number {}\n"
|
|
126
|
+
content.push_str(&format!("Text with <b>HTML tags</b> number {i}\n"));
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
// MD034 - Bare URL used
|
|
130
130
|
if i % 19 == 0 {
|
|
131
|
-
content.push_str(&format!("Visit http://example{}.com for more info\n"
|
|
131
|
+
content.push_str(&format!("Visit http://example{i}.com for more info\n"));
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// MD035 - Horizontal rule style
|
|
@@ -138,17 +138,17 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
138
138
|
|
|
139
139
|
// MD037 - Spaces inside emphasis markers
|
|
140
140
|
if i % 13 == 0 {
|
|
141
|
-
content.push_str(&format!("Text with * bad emphasis * number {}\n"
|
|
141
|
+
content.push_str(&format!("Text with * bad emphasis * number {i}\n"));
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
// MD038 - Spaces inside code span elements
|
|
145
145
|
if i % 21 == 0 {
|
|
146
|
-
content.push_str(&format!("Text with ` bad code ` number {}\n"
|
|
146
|
+
content.push_str(&format!("Text with ` bad code ` number {i}\n"));
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
// MD039 - Spaces inside link text
|
|
150
150
|
if i % 32 == 0 {
|
|
151
|
-
content.push_str(&format!("[ Link text ](http://example{}.com)\n"
|
|
151
|
+
content.push_str(&format!("[ Link text ](http://example{i}.com)\n"));
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
// MD040 - Fenced code language
|
|
@@ -158,17 +158,17 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
158
158
|
|
|
159
159
|
// MD042 - No empty links
|
|
160
160
|
if i % 70 == 0 {
|
|
161
|
-
content.push_str(&format!("[empty link {}]()\n"
|
|
161
|
+
content.push_str(&format!("[empty link {i}]()\n"));
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
// MD044 - Proper names
|
|
165
165
|
if i % 11 == 0 {
|
|
166
|
-
content.push_str(&format!("Text mentioning javascript and github number {}\n"
|
|
166
|
+
content.push_str(&format!("Text mentioning javascript and github number {i}\n"));
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
// MD045 - Images should have alternate text
|
|
170
170
|
if i % 75 == 0 {
|
|
171
|
-
content.push_str(&format!("\n"
|
|
171
|
+
content.push_str(&format!("\n"));
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
// MD047 - Files should end with a single newline (we'll handle this separately)
|
|
@@ -176,26 +176,24 @@ fn generate_problematic_content(size: usize) -> String {
|
|
|
176
176
|
// MD049 - Emphasis style
|
|
177
177
|
if i % 23 == 0 {
|
|
178
178
|
content.push_str(&format!(
|
|
179
|
-
"Text with _underscore emphasis_ and *asterisk emphasis* {}\n"
|
|
180
|
-
i
|
|
179
|
+
"Text with _underscore emphasis_ and *asterisk emphasis* {i}\n"
|
|
181
180
|
));
|
|
182
181
|
}
|
|
183
182
|
|
|
184
183
|
// MD050 - Strong style
|
|
185
184
|
if i % 27 == 0 {
|
|
186
185
|
content.push_str(&format!(
|
|
187
|
-
"Text with __underscore strong__ and **asterisk strong** {}\n"
|
|
188
|
-
i
|
|
186
|
+
"Text with __underscore strong__ and **asterisk strong** {i}\n"
|
|
189
187
|
));
|
|
190
188
|
}
|
|
191
189
|
|
|
192
190
|
// MD053 - Link and image reference definitions should be needed
|
|
193
191
|
if i % 80 == 0 {
|
|
194
|
-
content.push_str(&format!("[unused{}]: http://example{}.com\n"
|
|
192
|
+
content.push_str(&format!("[unused{i}]: http://example{i}.com\n"));
|
|
195
193
|
}
|
|
196
194
|
|
|
197
195
|
// Regular content
|
|
198
|
-
content.push_str(&format!("Regular paragraph {} with some content.\n\n"
|
|
196
|
+
content.push_str(&format!("Regular paragraph {i} with some content.\n\n"));
|
|
199
197
|
}
|
|
200
198
|
|
|
201
199
|
content
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
use criterion::{black_box, criterion_group, criterion_main
|
|
2
|
-
use rand::rng;
|
|
1
|
+
use criterion::{Criterion, black_box, criterion_group, criterion_main};
|
|
3
2
|
use rand::Rng;
|
|
4
|
-
use
|
|
3
|
+
use rand::rng;
|
|
5
4
|
use rumdl::LintContext;
|
|
6
5
|
use rumdl::MD053LinkImageReferenceDefinitions;
|
|
6
|
+
use rumdl::rule::Rule;
|
|
7
7
|
|
|
8
8
|
fn create_test_content(size: usize, ratio: f64) -> String {
|
|
9
9
|
let mut content = String::with_capacity(size);
|
|
@@ -20,9 +20,9 @@ fn create_test_content(size: usize, ratio: f64) -> String {
|
|
|
20
20
|
// 50% chance to add a reference
|
|
21
21
|
if rng.random::<f64>() < 0.7 {
|
|
22
22
|
// 70% chance to be a link, 30% to be an image
|
|
23
|
-
content.push_str(&format!("[Link {}][ref-{}]\n"
|
|
23
|
+
content.push_str(&format!("[Link {i}][ref-{i}]\n"));
|
|
24
24
|
} else {
|
|
25
|
-
content.push_str(&format!("![Image {}][ref-{}]\n"
|
|
25
|
+
content.push_str(&format!("![Image {i}][ref-{i}]\n"));
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -51,7 +51,7 @@ fn create_test_content(size: usize, ratio: f64) -> String {
|
|
|
51
51
|
for i in 0..100 {
|
|
52
52
|
if rng.random::<f64>() < ratio {
|
|
53
53
|
// Only add a portion based on ratio
|
|
54
|
-
content.push_str(&format!("[ref-{}]: https://example.com/ref-{}\n"
|
|
54
|
+
content.push_str(&format!("[ref-{i}]: https://example.com/ref-{i}\n"));
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -66,17 +66,17 @@ fn create_test_content_legacy() -> String {
|
|
|
66
66
|
for i in 0..200 {
|
|
67
67
|
if i < 100 {
|
|
68
68
|
// Used references
|
|
69
|
-
content.push_str(&format!("[ref{}]: https://example.com/ref{}\n"
|
|
69
|
+
content.push_str(&format!("[ref{i}]: https://example.com/ref{i}\n"));
|
|
70
70
|
} else {
|
|
71
71
|
// Unused references
|
|
72
|
-
content.push_str(&format!("[unused{}]: https://example.com/unused{}\n"
|
|
72
|
+
content.push_str(&format!("[unused{i}]: https://example.com/unused{i}\n"));
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
// Add reference usages
|
|
77
77
|
content.push_str("\n## Content with References\n\n");
|
|
78
78
|
for i in 0..100 {
|
|
79
|
-
content.push_str(&format!("This is a paragraph with a [link][ref{}] reference.\n"
|
|
79
|
+
content.push_str(&format!("This is a paragraph with a [link][ref{i}] reference.\n"));
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
content
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
use criterion::{black_box, criterion_group, criterion_main
|
|
2
|
-
use rand::rng;
|
|
1
|
+
use criterion::{Criterion, black_box, criterion_group, criterion_main};
|
|
3
2
|
use rand::Rng;
|
|
3
|
+
use rand::rng;
|
|
4
4
|
use rumdl::utils::range_utils::LineIndex;
|
|
5
5
|
|
|
6
6
|
// Naive implementation that doesn't use the optimized function
|
|
@@ -38,7 +38,7 @@ fn naive_line_col_to_byte_range(content: &str, line: usize, column: usize) -> st
|
|
|
38
38
|
|
|
39
39
|
fn generate_test_content(line_count: usize) -> String {
|
|
40
40
|
(0..line_count)
|
|
41
|
-
.map(|i| format!("Line {}: This is a test line with some content."
|
|
41
|
+
.map(|i| format!("Line {i}: This is a test line with some content."))
|
|
42
42
|
.collect::<Vec<String>>()
|
|
43
43
|
.join("\n")
|
|
44
44
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use criterion::{criterion_group, criterion_main
|
|
1
|
+
use criterion::{Criterion, criterion_group, criterion_main};
|
|
2
2
|
use rumdl::rule::Rule;
|
|
3
3
|
use rumdl::rules::{
|
|
4
4
|
MD013LineLength, MD033NoInlineHtml, MD037NoSpaceInEmphasis, MD044ProperNames, MD051LinkFragments,
|
|
@@ -30,8 +30,7 @@ fn bench_md033(c: &mut Criterion) {
|
|
|
30
30
|
// Generate 500 lines with HTML tags
|
|
31
31
|
for i in 0..500 {
|
|
32
32
|
content.push_str(&format!(
|
|
33
|
-
"Line {} with <span class=\"highlight\">HTML</span> and <div>nested <em>tags</em></div>\n"
|
|
34
|
-
i
|
|
33
|
+
"Line {i} with <span class=\"highlight\">HTML</span> and <div>nested <em>tags</em></div>\n"
|
|
35
34
|
));
|
|
36
35
|
}
|
|
37
36
|
|
|
@@ -49,13 +48,13 @@ fn bench_md037(c: &mut Criterion) {
|
|
|
49
48
|
for i in 0..500 {
|
|
50
49
|
if i % 3 == 0 {
|
|
51
50
|
// Incorrect: no spaces around emphasis
|
|
52
|
-
content.push_str(&format!("Line {} with*incorrect emphasis*markers\n"
|
|
51
|
+
content.push_str(&format!("Line {i} with*incorrect emphasis*markers\n"));
|
|
53
52
|
} else if i % 3 == 1 {
|
|
54
53
|
// Incorrect: spaces inside emphasis
|
|
55
|
-
content.push_str(&format!("Line {} with *incorrect emphasis *markers\n"
|
|
54
|
+
content.push_str(&format!("Line {i} with *incorrect emphasis *markers\n"));
|
|
56
55
|
} else {
|
|
57
56
|
// Correct: proper spaces around emphasis
|
|
58
|
-
content.push_str(&format!("Line {} with *correct emphasis* markers\n"
|
|
57
|
+
content.push_str(&format!("Line {i} with *correct emphasis* markers\n"));
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
|
|
@@ -115,7 +114,7 @@ fn bench_md051(c: &mut Criterion) {
|
|
|
115
114
|
|
|
116
115
|
// Add 100 headings
|
|
117
116
|
for i in 1..101 {
|
|
118
|
-
content.push_str(&format!("## Heading {}\n\n"
|
|
117
|
+
content.push_str(&format!("## Heading {i}\n\n"));
|
|
119
118
|
}
|
|
120
119
|
|
|
121
120
|
// Add 500 links, some with valid and some with invalid fragments
|
|
@@ -123,10 +122,10 @@ fn bench_md051(c: &mut Criterion) {
|
|
|
123
122
|
if i % 3 == 0 {
|
|
124
123
|
// Valid link
|
|
125
124
|
let heading_number = (i % 100) + 1;
|
|
126
|
-
content.push_str(&format!("This is a [valid link](#heading-{})\n"
|
|
125
|
+
content.push_str(&format!("This is a [valid link](#heading-{heading_number})\n"));
|
|
127
126
|
} else {
|
|
128
127
|
// Invalid link
|
|
129
|
-
content.push_str(&format!("This is an [invalid link](#non-existent-heading-{})\n"
|
|
128
|
+
content.push_str(&format!("This is an [invalid link](#non-existent-heading-{i})\n"));
|
|
130
129
|
}
|
|
131
130
|
}
|
|
132
131
|
|
|
@@ -146,17 +145,17 @@ fn bench_md053(c: &mut Criterion) {
|
|
|
146
145
|
for i in 0..200 {
|
|
147
146
|
if i < 100 {
|
|
148
147
|
// Used references
|
|
149
|
-
content.push_str(&format!("[ref{}]: https://example.com/ref{}\n"
|
|
148
|
+
content.push_str(&format!("[ref{i}]: https://example.com/ref{i}\n"));
|
|
150
149
|
} else {
|
|
151
150
|
// Unused references
|
|
152
|
-
content.push_str(&format!("[unused{}]: https://example.com/unused{}\n"
|
|
151
|
+
content.push_str(&format!("[unused{i}]: https://example.com/unused{i}\n"));
|
|
153
152
|
}
|
|
154
153
|
}
|
|
155
154
|
|
|
156
155
|
// Add reference usages
|
|
157
156
|
content.push_str("\n## Content with References\n\n");
|
|
158
157
|
for i in 0..100 {
|
|
159
|
-
content.push_str(&format!("This is a paragraph with a [link][ref{}] reference.\n"
|
|
158
|
+
content.push_str(&format!("This is a paragraph with a [link][ref{i}] reference.\n"));
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
let rule = MD053LinkImageReferenceDefinitions::default();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use criterion::{black_box, criterion_group, criterion_main
|
|
1
|
+
use criterion::{Criterion, black_box, criterion_group, criterion_main};
|
|
2
2
|
use rumdl::lint_context::LintContext;
|
|
3
3
|
use rumdl::rule::Rule;
|
|
4
4
|
use rumdl::rules::*;
|
|
@@ -9,7 +9,7 @@ fn generate_test_content() -> String {
|
|
|
9
9
|
|
|
10
10
|
for i in 0..500 {
|
|
11
11
|
// MD009 - Trailing spaces (very common)
|
|
12
|
-
content.push_str(&format!("Line {} with trailing spaces \n"
|
|
12
|
+
content.push_str(&format!("Line {i} with trailing spaces \n"));
|
|
13
13
|
|
|
14
14
|
// MD012 - Multiple blank lines
|
|
15
15
|
if i % 10 == 0 {
|
|
@@ -18,21 +18,21 @@ fn generate_test_content() -> String {
|
|
|
18
18
|
|
|
19
19
|
// MD018 - No space after hash
|
|
20
20
|
if i % 15 == 0 {
|
|
21
|
-
content.push_str(&format!("#Heading without space {}\n\n"
|
|
21
|
+
content.push_str(&format!("#Heading without space {i}\n\n"));
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// MD026 - Trailing punctuation
|
|
25
25
|
if i % 20 == 0 {
|
|
26
|
-
content.push_str(&format!("# Heading with punctuation {}!\n\n"
|
|
26
|
+
content.push_str(&format!("# Heading with punctuation {i}!\n\n"));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// MD037 - Spaces inside emphasis
|
|
30
30
|
if i % 8 == 0 {
|
|
31
|
-
content.push_str(&format!("Text with * bad emphasis * number {}\n"
|
|
31
|
+
content.push_str(&format!("Text with * bad emphasis * number {i}\n"));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// Regular content
|
|
35
|
-
content.push_str(&format!("Regular paragraph {} with some content.\n\n"
|
|
35
|
+
content.push_str(&format!("Regular paragraph {i} with some content.\n\n"));
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
content
|