1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
//! Modular rulesets for mdbook-lint
//!
//! This crate provides comprehensive markdown linting rules for mdBook projects and general markdown files.
//! Rules are organized into two main categories, each available as an optional feature.
//!
//! # Overview
//!
//! The `mdbook-lint-rulesets` crate implements the actual linting rules used by mdbook-lint.
//! It provides:
//!
//! - **59 standard markdown rules** (MD001-MD059) based on the markdownlint specification
//! - **7 mdBook-specific rules** (MDBOOK001-MDBOOK007) for mdBook project validation
//! - **Automatic fix support** for many rules to correct issues automatically
//! - **Configurable rules** with sensible defaults
//!
//! # Features
//!
//! - `standard` (default): Standard markdown linting rules
//! - `mdbook` (default): mdBook-specific linting rules
//! - `content`: Content quality rules (CONTENT001-005) - optional, off by default
//!
//! # Rule Categories
//!
//! ## Standard Markdown Rules (MD001-MD059)
//!
//! These rules cover common markdown style and formatting issues:
//!
//! - **Heading rules** (MD001-MD003, MD018-MD025): Heading hierarchy, style, and formatting
//! - **List rules** (MD004-MD007, MD029-MD032): List formatting, indentation, and consistency
//! - **Whitespace rules** (MD009-MD012, MD027-MD028): Trailing spaces, blank lines, tabs
//! - **Link rules** (MD034, MD039, MD042): URL formatting and link text
//! - **Code rules** (MD038, MD040, MD046, MD048): Code block formatting and fencing
//! - **Emphasis rules** (MD036-MD037, MD049-MD050): Bold and italic formatting
//!
//! ## mdBook-Specific Rules (MDBOOK001-MDBOOK007)
//!
//! These rules validate mdBook-specific requirements:
//!
//! - **MDBOOK001**: Code blocks should have language tags
//! - **MDBOOK002**: SUMMARY.md should follow mdBook structure
//! - **MDBOOK003**: Internal links should be valid
//! - **MDBOOK004**: Part titles should be formatted correctly
//! - **MDBOOK005**: Chapter paths should be relative
//! - **MDBOOK006**: Draft chapters should have content or be marked
//! - **MDBOOK007**: Separator syntax should be correct
//!
//! # Usage
//!
//! ## Basic Setup
//!
//! ```rust
//! use mdbook_lint_rulesets::{StandardRuleProvider, MdBookRuleProvider};
//! use mdbook_lint_core::PluginRegistry;
//!
//! let mut registry = PluginRegistry::new();
//!
//! // Register standard markdown rules
//! registry.register_provider(Box::new(StandardRuleProvider))?;
//!
//! // Register mdBook-specific rules
//! registry.register_provider(Box::new(MdBookRuleProvider))?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! ## Using with the Lint Engine
//!
//! ```rust
//! use mdbook_lint_core::{PluginRegistry, Document};
//! use mdbook_lint_rulesets::StandardRuleProvider;
//! use std::path::PathBuf;
//!
//! // Create registry and register provider
//! let mut registry = PluginRegistry::new();
//! registry.register_provider(Box::new(StandardRuleProvider))?;
//!
//! // Create engine with registered rules
//! let engine = registry.create_engine()?;
//!
//! // Lint a document
//! let content = "# My Document\n\n## Section\n";
//! let doc = Document::new(content.to_string(), PathBuf::from("README.md"))?;
//! let violations = engine.lint_document(&doc)?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! # Automatic Fixes
//!
//! Many rules support automatic fixing of violations. Rules with fix support include:
//!
//! - **MD009**: Remove trailing spaces
//! - **MD010**: Replace hard tabs with spaces
//! - **MD012**: Remove multiple consecutive blank lines
//! - **MD018**: Add space after hash in ATX headings
//! - **MD019**: Fix multiple spaces after hash
//! - **MD020**: Remove spaces inside closed ATX headings
//! - **MD021**: Fix multiple spaces inside closed ATX headings
//! - **MD023**: Remove indentation from headings
//! - **MD027**: Fix multiple spaces after blockquote symbol
//! - **MD030**: Fix spaces after list markers
//! - **MD034**: Wrap bare URLs in angle brackets
//! - **MD047**: Ensure files end with single newline
//!
//! # Configuration
//!
//! Rules can be configured through the `RuleConfig` trait. Example configuration:
//!
//! ```toml
//! [rules.MD013]
//! line_length = 120
//! code_blocks = false
//!
//! [rules.MD009]
//! br_spaces = 2
//! strict = false
//! ```
//!
//! # Quick Start (Library Usage)
//!
//! For the simplest usage, use `create_default_engine` to get a pre-configured
//! linting engine with all default rules:
//!
//! ```rust
//! use mdbook_lint_rulesets::create_default_engine;
//!
//! let engine = create_default_engine().expect("Failed to create engine");
//!
//! // Lint some content
//! let violations = engine.lint_content("# Hello\n\n\n\nWorld", "test.md").unwrap();
//!
//! // Apply automatic fixes
//! let (fixed, unfixed) = engine.apply_fixes("# Test\n\t", &violations);
//! ```
// Re-export core types for convenience
// This allows users to depend only on mdbook-lint-rulesets without needing mdbook-lint-core directly
pub use ;
/// Create a pre-configured lint engine with all default rules.
///
/// This is the recommended way to create a lint engine for most use cases.
/// It registers:
/// - Standard markdown rules (MD001-MD059)
/// - mdBook-specific rules (MDBOOK001-MDBOOK025)
/// - Content quality rules (if the `content` feature is enabled)
///
/// # Example
///
/// ```rust
/// use mdbook_lint_rulesets::create_default_engine;
///
/// let engine = create_default_engine()?;
///
/// // Lint content
/// let violations = engine.lint_content("# Test\n", "test.md")?;
///
/// // Apply fixes
/// let (fixed_content, unfixed) = engine.apply_fixes("# Test\n\t", &violations);
/// # Ok::<(), mdbook_lint_rulesets::MdBookLintError>(())
/// ```
///
/// # Errors
///
/// Returns an error if provider registration or engine creation fails.
// Standard markdown rules
pub use StandardRuleProvider;
// mdBook-specific rules
pub use MdBookRuleProvider;
// Content quality rules (optional, off by default)
pub use ContentRuleProvider;
// ADR (Architecture Decision Record) rules (optional, off by default)
pub use AdrRuleProvider;