rumdl 0.0.111__tar.gz → 0.0.112__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.111 → rumdl-0.0.112}/CHANGELOG.md +4 -1
- {rumdl-0.0.111 → rumdl-0.0.112}/Cargo.lock +1 -1
- {rumdl-0.0.111 → rumdl-0.0.112}/Cargo.toml +3 -1
- {rumdl-0.0.111 → rumdl-0.0.112}/PKG-INFO +1 -1
- rumdl-0.0.112/scripts/generate-downloads-table.sh +70 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation.rs +50 -6
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md033_no_inline_html.rs +62 -4
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md037_spaces_around_emphasis.rs +11 -0
- rumdl-0.0.112/src/utils/kramdown_utils.rs +252 -0
- rumdl-0.0.112/tests/kramdown_integration_test.rs +365 -0
- rumdl-0.0.112/tests/rules/md026_kramdown_test.rs +105 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md033_extended_test.rs +44 -44
- rumdl-0.0.112/tests/rules/md033_kramdown_test.rs +140 -0
- rumdl-0.0.112/tests/rules/md037_kramdown_test.rs +94 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/mod.rs +4 -0
- rumdl-0.0.111/src/bin/debug_frontmatter.rs +0 -42
- rumdl-0.0.111/src/utils/kramdown_utils.rs +0 -94
- {rumdl-0.0.111 → rumdl-0.0.112}/.config/nextest.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/.mise.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/.pre-commit-config.yaml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/.rumdl.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/.rustfmt.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/LICENSE +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/MANIFEST.in +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/Makefile +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/README.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/assets/logo.png +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benches/range_performance.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/bench_lint_context.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/benchmark.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/benchmark_rule.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/file_parallel_benchmark.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/measure_code_span_performance.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/RULES.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/global-settings.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md001.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md002.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md003.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md004.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md005.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md006.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md007.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md009.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md010.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md011.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md012.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md013.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md014.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md018.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md019.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md020.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md021.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md022.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md023.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md024.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md025.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md026.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md027.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md028.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md029.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md030.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md031.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md032.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md033.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md034.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md035.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md036.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md037.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md038.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md039.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md040.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md041.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md042.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md043.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md044.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md045.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md046.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md047.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md048.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md049.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md050.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md051.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md052.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md053.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md054.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md055.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md056.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md057.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/md058.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/docs/vscode-extension.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/parity_check.py +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/pyproject.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/python/MANIFEST.in +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/rumdl.toml.example +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/rust-toolchain.toml +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/scripts/setup-pre-commit.sh +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/scripts/update-pre-commit-docs.sh +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/exit_codes.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/inline_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/lib.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/lint_context.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/server.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/types.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/main.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/azure.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/concise.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/github.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/gitlab.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/grouped.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/json.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/json_lines.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/junit.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/pylint.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/sarif.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/text.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/output/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/parallel.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/performance.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/profiling.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/python.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rule.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rule_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/emphasis_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/text_reflow.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/src/vscode.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_explain_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_flag_precedence_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_statistics_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/cli_test_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/fixtures.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/test_utils.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/comprehensive_output_format_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/deeply_nested_lists_performance_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/escaped_brackets_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/init_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/inline_config_blocks_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/inline_config_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/lib.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlintignore_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/md013_reflow_integration_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/nested_code_block_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/output_format_integration_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/perf_check.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/python_bindings_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/emphasis_edge_cases_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/heading_edge_cases_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/inline_content_edge_cases_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/link_edge_cases_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/list_rules_integration_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md005_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md029_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md031_kramdown_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md034_ipv6_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md038_nested_backticks_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md051_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md058_kramdown_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules_mod_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_extension_fixes.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_tests.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_windows_comprehensive_test.rs +0 -0
- {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_windows_test.rs +0 -0
|
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.112] - 2025-08-08
|
|
11
|
+
|
|
10
12
|
## [0.0.110] - 2025-08-08
|
|
11
13
|
|
|
12
14
|
## [0.0.110] - 2025-08-08
|
|
@@ -302,7 +304,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
302
304
|
|
|
303
305
|
- Initial implementation of remaining rules for markdownlint parity
|
|
304
306
|
|
|
305
|
-
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.
|
|
307
|
+
[Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.112...HEAD
|
|
308
|
+
[0.0.112]: https://github.com/rvben/rumdl/compare/v0.0.111...v0.0.112
|
|
306
309
|
[0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
|
|
307
310
|
[0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
|
|
308
311
|
[0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rumdl"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.112"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
rust-version = "1.88.0"
|
|
6
6
|
description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
|
|
@@ -13,6 +13,8 @@ readme = "README.md"
|
|
|
13
13
|
keywords = ["markdown", "linter", "markdown-linter", "static-analysis", "documentation"]
|
|
14
14
|
categories = ["command-line-utilities", "development-tools", "text-processing"]
|
|
15
15
|
exclude = [".github/", ".gitignore", "*.bak"]
|
|
16
|
+
autobins = false # Prevent automatic binary discovery in src/bin/
|
|
17
|
+
default-run = "rumdl" # Default binary for cargo run
|
|
16
18
|
|
|
17
19
|
[lib]
|
|
18
20
|
name = "rumdl"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Generate a markdown table for release downloads
|
|
3
|
+
|
|
4
|
+
VERSION="${1:-}"
|
|
5
|
+
if [ -z "$VERSION" ]; then
|
|
6
|
+
echo "Usage: $0 <version>"
|
|
7
|
+
echo "Example: $0 v0.0.111"
|
|
8
|
+
exit 1
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
# Start the markdown table
|
|
12
|
+
cat << 'EOF'
|
|
13
|
+
## Downloads
|
|
14
|
+
|
|
15
|
+
| File | Platform | Checksum |
|
|
16
|
+
|------|----------|----------|
|
|
17
|
+
EOF
|
|
18
|
+
|
|
19
|
+
# Generate table rows for each platform
|
|
20
|
+
generate_row() {
|
|
21
|
+
local target="$1"
|
|
22
|
+
local platform="$2"
|
|
23
|
+
|
|
24
|
+
# Determine file extension based on platform
|
|
25
|
+
if [[ "$target" == *"windows"* ]]; then
|
|
26
|
+
ext="zip"
|
|
27
|
+
else
|
|
28
|
+
ext="tar.gz"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
filename="rumdl-${VERSION}-${target}.${ext}"
|
|
32
|
+
checksum_file="${filename}.sha256"
|
|
33
|
+
|
|
34
|
+
# Generate download URLs
|
|
35
|
+
download_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${filename}"
|
|
36
|
+
checksum_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${checksum_file}"
|
|
37
|
+
|
|
38
|
+
# Output table row
|
|
39
|
+
echo "| [${filename}](${download_url}) | ${platform} | [checksum](${checksum_url}) |"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Generate rows for each platform
|
|
43
|
+
generate_row "x86_64-unknown-linux-gnu" "Linux x86_64"
|
|
44
|
+
generate_row "x86_64-unknown-linux-musl" "Linux x86_64 (musl)"
|
|
45
|
+
generate_row "aarch64-unknown-linux-gnu" "Linux ARM64"
|
|
46
|
+
generate_row "aarch64-unknown-linux-musl" "Linux ARM64 (musl)"
|
|
47
|
+
generate_row "x86_64-apple-darwin" "macOS x86_64"
|
|
48
|
+
generate_row "aarch64-apple-darwin" "macOS ARM64 (Apple Silicon)"
|
|
49
|
+
generate_row "x86_64-pc-windows-msvc" "Windows x86_64"
|
|
50
|
+
|
|
51
|
+
echo ""
|
|
52
|
+
echo "## Installation"
|
|
53
|
+
echo ""
|
|
54
|
+
echo "### Using uv (Recommended)"
|
|
55
|
+
echo '```bash'
|
|
56
|
+
echo 'uv tool install rumdl'
|
|
57
|
+
echo '```'
|
|
58
|
+
echo ""
|
|
59
|
+
echo "### Using pip"
|
|
60
|
+
echo '```bash'
|
|
61
|
+
echo 'pip install rumdl'
|
|
62
|
+
echo '```'
|
|
63
|
+
echo ""
|
|
64
|
+
echo "### Using pipx"
|
|
65
|
+
echo '```bash'
|
|
66
|
+
echo 'pipx install rumdl'
|
|
67
|
+
echo '```'
|
|
68
|
+
echo ""
|
|
69
|
+
echo "### Direct Download"
|
|
70
|
+
echo "Download the appropriate binary for your platform from the table above, extract it, and add it to your PATH."
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
///
|
|
3
3
|
/// See [docs/md026.md](../../docs/md026.md) for full documentation, configuration, and examples.
|
|
4
4
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
|
|
5
|
+
use crate::utils::kramdown_utils::has_header_id;
|
|
5
6
|
use crate::utils::range_utils::calculate_match_range;
|
|
6
7
|
use lazy_static::lazy_static;
|
|
7
8
|
use regex::Regex;
|
|
@@ -195,6 +196,16 @@ impl MD026NoTrailingPunctuation {
|
|
|
195
196
|
let space = captures.get(3).unwrap().as_str();
|
|
196
197
|
let content = captures.get(4).unwrap().as_str();
|
|
197
198
|
|
|
199
|
+
// If content has a valid Kramdown header ID, don't fix it
|
|
200
|
+
if has_header_id(content) {
|
|
201
|
+
// Return the line unchanged
|
|
202
|
+
if let Some(trailing) = captures.get(5) {
|
|
203
|
+
return format!("{}{}{}{}{}", indentation, hashes, space, content, trailing.as_str());
|
|
204
|
+
}
|
|
205
|
+
return format!("{indentation}{hashes}{space}{content}");
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Otherwise, remove trailing punctuation
|
|
198
209
|
let fixed_content = self.remove_trailing_punctuation(content, re);
|
|
199
210
|
|
|
200
211
|
// Preserve any trailing hashes if present
|
|
@@ -297,10 +308,26 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
297
308
|
continue;
|
|
298
309
|
}
|
|
299
310
|
|
|
300
|
-
//
|
|
301
|
-
if
|
|
311
|
+
// For headers with potential Kramdown syntax, we need to be more careful
|
|
312
|
+
let text_to_check = if has_header_id(&heading.text) {
|
|
313
|
+
// Valid Kramdown ID - skip this header entirely
|
|
314
|
+
continue;
|
|
315
|
+
} else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
|
|
316
|
+
// Has curly braces but not a valid Kramdown ID
|
|
317
|
+
// Check for punctuation before the opening brace
|
|
318
|
+
if let Some(brace_pos) = heading.text.rfind('{') {
|
|
319
|
+
heading.text[..brace_pos].trim().to_string()
|
|
320
|
+
} else {
|
|
321
|
+
heading.text.clone()
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
// Regular header without Kramdown syntax
|
|
325
|
+
heading.text.clone()
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
if self.has_trailing_punctuation(&text_to_check, &re) {
|
|
302
329
|
// Find the trailing punctuation
|
|
303
|
-
if let Some(punctuation_match) = re.find(&
|
|
330
|
+
if let Some(punctuation_match) = re.find(&text_to_check) {
|
|
304
331
|
let line = &line_info.content;
|
|
305
332
|
|
|
306
333
|
// For ATX headings, find the punctuation position in the line
|
|
@@ -316,14 +343,14 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
316
343
|
punctuation_len,
|
|
317
344
|
);
|
|
318
345
|
|
|
319
|
-
let last_char =
|
|
346
|
+
let last_char = text_to_check.chars().last().unwrap_or(' ');
|
|
320
347
|
warnings.push(LintWarning {
|
|
321
348
|
rule_name: Some(self.name()),
|
|
322
349
|
line: start_line,
|
|
323
350
|
column: start_col,
|
|
324
351
|
end_line,
|
|
325
352
|
end_column: end_col,
|
|
326
|
-
message: format!("Heading '{}' ends with punctuation '{}'"
|
|
353
|
+
message: format!("Heading '{text_to_check}' ends with punctuation '{last_char}'"),
|
|
327
354
|
severity: Severity::Warning,
|
|
328
355
|
fix: Some(Fix {
|
|
329
356
|
range: self.get_line_byte_range(content, line_num + 1),
|
|
@@ -386,8 +413,25 @@ impl Rule for MD026NoTrailingPunctuation {
|
|
|
386
413
|
continue;
|
|
387
414
|
}
|
|
388
415
|
|
|
416
|
+
// Handle headers with potential Kramdown syntax
|
|
417
|
+
let text_to_check = if has_header_id(&heading.text) {
|
|
418
|
+
// Valid Kramdown ID - skip this header entirely
|
|
419
|
+
continue;
|
|
420
|
+
} else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
|
|
421
|
+
// Has curly braces but not a valid Kramdown ID
|
|
422
|
+
// Check for punctuation before the opening brace
|
|
423
|
+
if let Some(brace_pos) = heading.text.rfind('{') {
|
|
424
|
+
heading.text[..brace_pos].trim().to_string()
|
|
425
|
+
} else {
|
|
426
|
+
heading.text.clone()
|
|
427
|
+
}
|
|
428
|
+
} else {
|
|
429
|
+
// Regular header without Kramdown syntax
|
|
430
|
+
heading.text.clone()
|
|
431
|
+
};
|
|
432
|
+
|
|
389
433
|
// Check and fix trailing punctuation
|
|
390
|
-
if self.has_trailing_punctuation(&
|
|
434
|
+
if self.has_trailing_punctuation(&text_to_check, &re) {
|
|
391
435
|
fixed_lines[line_num] = if matches!(heading.style, crate::lint_context::HeadingStyle::ATX) {
|
|
392
436
|
self.fix_atx_heading(&line_info.content, &re)
|
|
393
437
|
} else {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
7
7
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
8
|
+
use crate::utils::kramdown_utils::{is_kramdown_block_attribute, is_kramdown_extension};
|
|
8
9
|
use crate::utils::range_utils::calculate_html_tag_range;
|
|
9
10
|
use crate::utils::regex_cache::*;
|
|
10
11
|
use lazy_static::lazy_static;
|
|
@@ -157,7 +158,13 @@ impl MD033NoInlineHtml {
|
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
/// Find HTML tags that span multiple lines
|
|
160
|
-
fn find_multiline_html_tags(
|
|
161
|
+
fn find_multiline_html_tags(
|
|
162
|
+
&self,
|
|
163
|
+
content: &str,
|
|
164
|
+
structure: &DocumentStructure,
|
|
165
|
+
nomarkdown_ranges: &[(usize, usize)],
|
|
166
|
+
warnings: &mut Vec<LintWarning>,
|
|
167
|
+
) {
|
|
161
168
|
// Early return: if content has no incomplete tags at line ends, skip processing
|
|
162
169
|
if !content.contains('<') || !content.lines().any(|line| line.trim_end().ends_with('<')) {
|
|
163
170
|
return;
|
|
@@ -178,6 +185,14 @@ impl MD033NoInlineHtml {
|
|
|
178
185
|
continue;
|
|
179
186
|
}
|
|
180
187
|
|
|
188
|
+
// Skip lines inside nomarkdown blocks
|
|
189
|
+
if nomarkdown_ranges
|
|
190
|
+
.iter()
|
|
191
|
+
.any(|(start, end)| line_num >= *start && line_num <= *end)
|
|
192
|
+
{
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
|
|
181
196
|
// Early return: skip lines that don't end with incomplete tags
|
|
182
197
|
if !line.contains('<') {
|
|
183
198
|
continue;
|
|
@@ -288,7 +303,37 @@ impl Rule for MD033NoInlineHtml {
|
|
|
288
303
|
let mut warnings = Vec::new();
|
|
289
304
|
let lines: Vec<&str> = content.lines().collect();
|
|
290
305
|
|
|
291
|
-
//
|
|
306
|
+
// Track nomarkdown and comment blocks
|
|
307
|
+
let mut in_nomarkdown = false;
|
|
308
|
+
let mut in_comment = false;
|
|
309
|
+
let mut nomarkdown_ranges: Vec<(usize, usize)> = Vec::new();
|
|
310
|
+
let mut nomarkdown_start = 0;
|
|
311
|
+
let mut comment_start = 0;
|
|
312
|
+
|
|
313
|
+
// First pass: identify nomarkdown and comment blocks
|
|
314
|
+
for (i, line) in lines.iter().enumerate() {
|
|
315
|
+
let line_num = i + 1;
|
|
316
|
+
|
|
317
|
+
// Check for nomarkdown start
|
|
318
|
+
if line.trim() == "{::nomarkdown}" {
|
|
319
|
+
in_nomarkdown = true;
|
|
320
|
+
nomarkdown_start = line_num;
|
|
321
|
+
} else if line.trim() == "{:/nomarkdown}" && in_nomarkdown {
|
|
322
|
+
in_nomarkdown = false;
|
|
323
|
+
nomarkdown_ranges.push((nomarkdown_start, line_num));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Check for comment blocks
|
|
327
|
+
if line.trim() == "{::comment}" {
|
|
328
|
+
in_comment = true;
|
|
329
|
+
comment_start = line_num;
|
|
330
|
+
} else if line.trim() == "{:/comment}" && in_comment {
|
|
331
|
+
in_comment = false;
|
|
332
|
+
nomarkdown_ranges.push((comment_start, line_num));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Second pass: find single-line HTML tags
|
|
292
337
|
// To match markdownlint behavior, report one warning per HTML tag
|
|
293
338
|
for (i, line) in lines.iter().enumerate() {
|
|
294
339
|
let line_num = i + 1;
|
|
@@ -305,6 +350,19 @@ impl Rule for MD033NoInlineHtml {
|
|
|
305
350
|
continue;
|
|
306
351
|
}
|
|
307
352
|
|
|
353
|
+
// Skip lines inside nomarkdown blocks
|
|
354
|
+
if nomarkdown_ranges
|
|
355
|
+
.iter()
|
|
356
|
+
.any(|(start, end)| line_num >= *start && line_num <= *end)
|
|
357
|
+
{
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Skip Kramdown extensions and block attributes
|
|
362
|
+
if is_kramdown_extension(line) || is_kramdown_block_attribute(line) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
|
|
308
366
|
// Find all HTML tags in the line using regex
|
|
309
367
|
for tag_match in HTML_TAG_FINDER.find_iter(line) {
|
|
310
368
|
let tag = tag_match.as_str();
|
|
@@ -356,8 +414,8 @@ impl Rule for MD033NoInlineHtml {
|
|
|
356
414
|
}
|
|
357
415
|
}
|
|
358
416
|
|
|
359
|
-
//
|
|
360
|
-
self.find_multiline_html_tags(ctx.content, structure, &mut warnings);
|
|
417
|
+
// Third pass: find multi-line HTML tags
|
|
418
|
+
self.find_multiline_html_tags(ctx.content, structure, &nomarkdown_ranges, &mut warnings);
|
|
361
419
|
|
|
362
420
|
Ok(warnings)
|
|
363
421
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
|
|
5
5
|
use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
|
|
6
6
|
use crate::utils::emphasis_utils::{EmphasisSpan, find_emphasis_markers, find_emphasis_spans, has_doc_patterns};
|
|
7
|
+
use crate::utils::kramdown_utils::has_span_ial;
|
|
7
8
|
use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
|
|
8
9
|
use lazy_static::lazy_static;
|
|
9
10
|
use regex::Regex;
|
|
@@ -330,6 +331,16 @@ impl MD037NoSpaceInEmphasis {
|
|
|
330
331
|
let full_end = span.closing.end_pos();
|
|
331
332
|
let full_text = &content[full_start..full_end];
|
|
332
333
|
|
|
334
|
+
// Skip if this emphasis has a Kramdown span IAL immediately after it
|
|
335
|
+
// (no space between emphasis and IAL)
|
|
336
|
+
if full_end < content.len() {
|
|
337
|
+
let remaining = &content[full_end..];
|
|
338
|
+
// Check if IAL starts immediately after the emphasis (no whitespace)
|
|
339
|
+
if remaining.starts_with('{') && has_span_ial(remaining.split_whitespace().next().unwrap_or("")) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
333
344
|
// Create the marker string efficiently
|
|
334
345
|
let marker_char = span.opening.as_char();
|
|
335
346
|
let marker_str = if span.opening.count == 1 {
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
//! Utilities for handling Kramdown-specific syntax
|
|
2
|
+
//!
|
|
3
|
+
//! Kramdown is a superset of Markdown that adds additional features like
|
|
4
|
+
//! Inline Attribute Lists (IAL) for adding attributes to elements.
|
|
5
|
+
|
|
6
|
+
use lazy_static::lazy_static;
|
|
7
|
+
use regex::Regex;
|
|
8
|
+
|
|
9
|
+
lazy_static! {
|
|
10
|
+
/// Pattern for Kramdown span IAL: text{:.class #id key="value"}
|
|
11
|
+
static ref SPAN_IAL_PATTERN: Regex = Regex::new(r"\{[:\.#][^}]*\}$").unwrap();
|
|
12
|
+
|
|
13
|
+
/// Pattern for Kramdown header IDs: # Header {#custom-id}
|
|
14
|
+
static ref HEADER_ID_PATTERN: Regex = Regex::new(r"\s*\{#[a-zA-Z][\w\-:.]*\}\s*$").unwrap();
|
|
15
|
+
|
|
16
|
+
/// Pattern for Kramdown extensions opening: {::comment}, {::nomarkdown}, etc.
|
|
17
|
+
static ref EXTENSION_OPEN_PATTERN: Regex = Regex::new(r"^\s*\{::([a-z]+)(?:\s+[^}]*)?\}\s*$").unwrap();
|
|
18
|
+
|
|
19
|
+
/// Pattern for Kramdown extensions closing: {:/comment}, {:/}, etc.
|
|
20
|
+
static ref EXTENSION_CLOSE_PATTERN: Regex = Regex::new(r"^\s*\{:/([a-z]+)?\}\s*$").unwrap();
|
|
21
|
+
|
|
22
|
+
/// Pattern for Kramdown options: {::options key="value" /}
|
|
23
|
+
static ref OPTIONS_PATTERN: Regex = Regex::new(r"^\s*\{::options\s+[^}]+/\}\s*$").unwrap();
|
|
24
|
+
|
|
25
|
+
/// Pattern for footnote references: [^footnote]
|
|
26
|
+
static ref FOOTNOTE_REF_PATTERN: Regex = Regex::new(r"\[\^[a-zA-Z0-9_\-]+\]").unwrap();
|
|
27
|
+
|
|
28
|
+
/// Pattern for footnote definitions: [^footnote]: definition
|
|
29
|
+
static ref FOOTNOTE_DEF_PATTERN: Regex = Regex::new(r"^\[\^[a-zA-Z0-9_\-]+\]:").unwrap();
|
|
30
|
+
|
|
31
|
+
/// Pattern for abbreviations: *[HTML]: HyperText Markup Language
|
|
32
|
+
static ref ABBREVIATION_PATTERN: Regex = Regex::new(r"^\*\[[^\]]+\]:").unwrap();
|
|
33
|
+
|
|
34
|
+
/// Pattern for math blocks: $$ or $
|
|
35
|
+
static ref MATH_BLOCK_PATTERN: Regex = Regex::new(r"^\$\$").unwrap();
|
|
36
|
+
static ref MATH_INLINE_PATTERN: Regex = Regex::new(r"\$[^$]+\$").unwrap();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// Check if a line is a Kramdown block attribute (IAL - Inline Attribute List)
|
|
40
|
+
///
|
|
41
|
+
/// Kramdown IAL syntax allows adding attributes to block elements:
|
|
42
|
+
/// - `{:.class}` - CSS class
|
|
43
|
+
/// - `{:#id}` - Element ID
|
|
44
|
+
/// - `{:attribute="value"}` - Generic attributes
|
|
45
|
+
/// - `{:.class #id attribute="value"}` - Combinations
|
|
46
|
+
///
|
|
47
|
+
/// # Examples
|
|
48
|
+
///
|
|
49
|
+
/// ```
|
|
50
|
+
/// use rumdl::utils::kramdown_utils::is_kramdown_block_attribute;
|
|
51
|
+
///
|
|
52
|
+
/// assert!(is_kramdown_block_attribute("{:.wrap}"));
|
|
53
|
+
/// assert!(is_kramdown_block_attribute("{:#my-id}"));
|
|
54
|
+
/// assert!(is_kramdown_block_attribute("{:.class #id}"));
|
|
55
|
+
/// assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
|
|
56
|
+
///
|
|
57
|
+
/// assert!(!is_kramdown_block_attribute("{just text}"));
|
|
58
|
+
/// assert!(!is_kramdown_block_attribute("{}"));
|
|
59
|
+
/// assert!(!is_kramdown_block_attribute("{"));
|
|
60
|
+
/// ```
|
|
61
|
+
pub fn is_kramdown_block_attribute(line: &str) -> bool {
|
|
62
|
+
let trimmed = line.trim();
|
|
63
|
+
|
|
64
|
+
// Must start with { and end with }
|
|
65
|
+
if !trimmed.starts_with('{') || !trimmed.ends_with('}') || trimmed.len() < 3 {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Check if it matches Kramdown IAL patterns
|
|
70
|
+
// Valid patterns start with {: or {# or {.
|
|
71
|
+
let second_char = trimmed.chars().nth(1);
|
|
72
|
+
matches!(second_char, Some(':') | Some('#') | Some('.'))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// Check if text ends with a Kramdown span IAL (inline attribute)
|
|
76
|
+
///
|
|
77
|
+
/// # Examples
|
|
78
|
+
/// ```
|
|
79
|
+
/// use rumdl::utils::kramdown_utils::has_span_ial;
|
|
80
|
+
///
|
|
81
|
+
/// assert!(has_span_ial("*emphasized*{:.highlight}"));
|
|
82
|
+
/// assert!(has_span_ial("[link](url){:target=\"_blank\"}"));
|
|
83
|
+
/// assert!(!has_span_ial("regular text"));
|
|
84
|
+
/// ```
|
|
85
|
+
pub fn has_span_ial(text: &str) -> bool {
|
|
86
|
+
SPAN_IAL_PATTERN.is_match(text.trim())
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Remove span IAL from text if present
|
|
90
|
+
pub fn remove_span_ial(text: &str) -> &str {
|
|
91
|
+
if let Some(captures) = SPAN_IAL_PATTERN.find(text) {
|
|
92
|
+
&text[..captures.start()]
|
|
93
|
+
} else {
|
|
94
|
+
text
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// Check if a heading line has a Kramdown header ID
|
|
99
|
+
///
|
|
100
|
+
/// # Examples
|
|
101
|
+
/// ```
|
|
102
|
+
/// use rumdl::utils::kramdown_utils::has_header_id;
|
|
103
|
+
///
|
|
104
|
+
/// assert!(has_header_id("# Header {#custom-id}"));
|
|
105
|
+
/// assert!(has_header_id("## Section {#section-1}"));
|
|
106
|
+
/// assert!(!has_header_id("# Regular Header"));
|
|
107
|
+
/// ```
|
|
108
|
+
pub fn has_header_id(line: &str) -> bool {
|
|
109
|
+
HEADER_ID_PATTERN.is_match(line)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// Remove header ID from a heading line if present
|
|
113
|
+
pub fn remove_header_id(line: &str) -> String {
|
|
114
|
+
HEADER_ID_PATTERN.replace(line, "").to_string()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/// Check if a line is a Kramdown extension opening tag
|
|
118
|
+
///
|
|
119
|
+
/// Extensions include: comment, nomarkdown, options
|
|
120
|
+
pub fn is_kramdown_extension_open(line: &str) -> bool {
|
|
121
|
+
EXTENSION_OPEN_PATTERN.is_match(line)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Check if a line is a Kramdown extension closing tag
|
|
125
|
+
pub fn is_kramdown_extension_close(line: &str) -> bool {
|
|
126
|
+
EXTENSION_CLOSE_PATTERN.is_match(line)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// Check if a line is a Kramdown options directive
|
|
130
|
+
pub fn is_kramdown_options(line: &str) -> bool {
|
|
131
|
+
OPTIONS_PATTERN.is_match(line)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Check if a line is a Kramdown extension (any type)
|
|
135
|
+
pub fn is_kramdown_extension(line: &str) -> bool {
|
|
136
|
+
is_kramdown_extension_open(line) || is_kramdown_extension_close(line) || is_kramdown_options(line)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// Check if a line is an End-of-Block (EOB) marker
|
|
140
|
+
///
|
|
141
|
+
/// In Kramdown, a line containing only `^` ends the current block
|
|
142
|
+
pub fn is_eob_marker(line: &str) -> bool {
|
|
143
|
+
line.trim() == "^"
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/// Check if text contains a footnote reference
|
|
147
|
+
pub fn has_footnote_reference(text: &str) -> bool {
|
|
148
|
+
FOOTNOTE_REF_PATTERN.is_match(text)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Check if a line is a footnote definition
|
|
152
|
+
pub fn is_footnote_definition(line: &str) -> bool {
|
|
153
|
+
FOOTNOTE_DEF_PATTERN.is_match(line.trim_start())
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/// Check if a line is an abbreviation definition
|
|
157
|
+
pub fn is_abbreviation_definition(line: &str) -> bool {
|
|
158
|
+
ABBREVIATION_PATTERN.is_match(line.trim_start())
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Check if a line starts a math block
|
|
162
|
+
pub fn is_math_block_delimiter(line: &str) -> bool {
|
|
163
|
+
let trimmed = line.trim();
|
|
164
|
+
trimmed == "$$" || MATH_BLOCK_PATTERN.is_match(trimmed)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// Check if text contains inline math
|
|
168
|
+
pub fn has_inline_math(text: &str) -> bool {
|
|
169
|
+
MATH_INLINE_PATTERN.is_match(text)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/// Check if a line is a definition list item
|
|
173
|
+
///
|
|
174
|
+
/// Definition lists in Kramdown use the pattern:
|
|
175
|
+
/// ```
|
|
176
|
+
/// Term
|
|
177
|
+
/// : Definition
|
|
178
|
+
/// ```
|
|
179
|
+
pub fn is_definition_list_item(line: &str) -> bool {
|
|
180
|
+
let trimmed = line.trim_start();
|
|
181
|
+
trimmed.starts_with(": ")
|
|
182
|
+
|| (trimmed.starts_with(':') && trimmed.len() > 1 && trimmed.chars().nth(1).is_some_and(|c| c.is_whitespace()))
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/// Check if a line contains any Kramdown-specific syntax
|
|
186
|
+
pub fn has_kramdown_syntax(line: &str) -> bool {
|
|
187
|
+
is_kramdown_block_attribute(line)
|
|
188
|
+
|| has_span_ial(line)
|
|
189
|
+
|| has_header_id(line)
|
|
190
|
+
|| is_kramdown_extension(line)
|
|
191
|
+
|| is_eob_marker(line)
|
|
192
|
+
|| is_footnote_definition(line)
|
|
193
|
+
|| is_abbreviation_definition(line)
|
|
194
|
+
|| is_math_block_delimiter(line)
|
|
195
|
+
|| is_definition_list_item(line)
|
|
196
|
+
|| has_footnote_reference(line)
|
|
197
|
+
|| has_inline_math(line)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
#[cfg(test)]
|
|
201
|
+
mod tests {
|
|
202
|
+
use super::*;
|
|
203
|
+
|
|
204
|
+
#[test]
|
|
205
|
+
fn test_kramdown_class_attributes() {
|
|
206
|
+
assert!(is_kramdown_block_attribute("{:.wrap}"));
|
|
207
|
+
assert!(is_kramdown_block_attribute("{:.class-name}"));
|
|
208
|
+
assert!(is_kramdown_block_attribute("{:.multiple .classes}"));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
#[test]
|
|
212
|
+
fn test_kramdown_id_attributes() {
|
|
213
|
+
assert!(is_kramdown_block_attribute("{:#my-id}"));
|
|
214
|
+
assert!(is_kramdown_block_attribute("{:#section-1}"));
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
#[test]
|
|
218
|
+
fn test_kramdown_generic_attributes() {
|
|
219
|
+
assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
|
|
220
|
+
assert!(is_kramdown_block_attribute("{:data-value=\"123\"}"));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
#[test]
|
|
224
|
+
fn test_kramdown_combined_attributes() {
|
|
225
|
+
assert!(is_kramdown_block_attribute("{:.class #id}"));
|
|
226
|
+
assert!(is_kramdown_block_attribute("{:#id .class style=\"color: blue\"}"));
|
|
227
|
+
assert!(is_kramdown_block_attribute("{:.wrap #my-code .highlight}"));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
#[test]
|
|
231
|
+
fn test_non_kramdown_braces() {
|
|
232
|
+
assert!(!is_kramdown_block_attribute("{just some text}"));
|
|
233
|
+
assert!(!is_kramdown_block_attribute("{not kramdown}"));
|
|
234
|
+
assert!(!is_kramdown_block_attribute("{ spaces }"));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
#[test]
|
|
238
|
+
fn test_edge_cases() {
|
|
239
|
+
assert!(!is_kramdown_block_attribute("{}"));
|
|
240
|
+
assert!(!is_kramdown_block_attribute("{"));
|
|
241
|
+
assert!(!is_kramdown_block_attribute("}"));
|
|
242
|
+
assert!(!is_kramdown_block_attribute(""));
|
|
243
|
+
assert!(!is_kramdown_block_attribute("not braces"));
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
#[test]
|
|
247
|
+
fn test_whitespace_handling() {
|
|
248
|
+
assert!(is_kramdown_block_attribute(" {:.wrap} "));
|
|
249
|
+
assert!(is_kramdown_block_attribute("\t{:#id}\t"));
|
|
250
|
+
assert!(is_kramdown_block_attribute(" {:.class #id} "));
|
|
251
|
+
}
|
|
252
|
+
}
|