mdbook/crates/mdbook-markdown/src/lib.rs

61 lines
1.8 KiB
Rust

//! Markdown processing used in mdBook.
//!
//! This crate provides functions for processing Markdown in the same way as
//! [mdBook](https://rust-lang.github.io/mdBook/). The [`pulldown_cmark`]
//! crate is used as the underlying parser. This crate re-exports
//! [`pulldown_cmark`] so that you can access its types.
use pulldown_cmark::{Options, Parser};
#[doc(inline)]
pub use pulldown_cmark;
/// Options for parsing markdown.
#[non_exhaustive]
pub struct MarkdownOptions {
/// Enables smart punctuation.
///
/// Converts quotes to curly quotes, `...` to `…`, `--` to en-dash, and
/// `---` to em-dash.
///
/// This is `true` by default.
pub smart_punctuation: bool,
/// Enables definition lists.
///
/// This is `true` by default.
pub definition_lists: bool,
/// Enables admonitions.
///
/// This is `true` by default.
pub admonitions: bool,
}
impl Default for MarkdownOptions {
fn default() -> MarkdownOptions {
MarkdownOptions {
smart_punctuation: true,
definition_lists: true,
admonitions: true,
}
}
}
/// Creates a new pulldown-cmark parser of the given text.
pub fn new_cmark_parser<'text>(text: &'text str, options: &MarkdownOptions) -> Parser<'text> {
let mut opts = Options::empty();
opts.insert(Options::ENABLE_TABLES);
opts.insert(Options::ENABLE_FOOTNOTES);
opts.insert(Options::ENABLE_STRIKETHROUGH);
opts.insert(Options::ENABLE_TASKLISTS);
opts.insert(Options::ENABLE_HEADING_ATTRIBUTES);
if options.smart_punctuation {
opts.insert(Options::ENABLE_SMART_PUNCTUATION);
}
if options.definition_lists {
opts.insert(Options::ENABLE_DEFINITION_LIST);
}
if options.admonitions {
opts.insert(Options::ENABLE_GFM);
}
Parser::new_ext(text, opts)
}