prettify_cmark/lib.rs
1//! Pretty-printing for [CommonMark](http://commonmark.org/) documents.
2//!
3//! ## Simple API
4//!
5//! For simple use-cases, the [`prettify`](./fn.prettify.html) function
6//! can be used to parse and pretty-print a CommonMark document.
7//!
8//! ```rust
9//! use prettify_cmark::prettify;
10//!
11//! let output = prettify("Lorem __ipsum__ dolor `sit` amet!");
12//!
13//! assert_eq!(output, "Lorem **ipsum** dolor `sit` amet!")
14//! ```
15//!
16//! ## Advanced API
17//!
18//! For more advanced use-cases, this crate is designed to work well together
19//! with the [`pulldown-cmark`](https://crates.io/crates/pulldown-cmark) crate.
20//!
21//! It provides a [`PrettyPrinter`](./struct.PrettyPrinter.html) which wraps
22//! around an output type (such as `String`), and into which events can be
23//! pushed that have been obtained from `pulldown-cmark`.
24//!
25//! ```rust
26//! # extern crate pulldown_cmark;
27//! # extern crate prettify_cmark;
28//! use pulldown_cmark::Parser;
29//! use prettify_cmark::PrettyPrinter;
30//!
31//! # fn main() {
32//! let events = Parser::new("Lorem _ipsum_ dolor `sit`.");
33//! let mut printer = PrettyPrinter::default();
34//! printer.push_events(events).unwrap();
35//!
36//! assert_eq!(printer.into_inner(), "Lorem *ipsum* dolor `sit`.")
37//! # }
38//! ```
39
40pub extern crate pulldown_cmark;
41
42use std::fmt::{Display, Formatter, Result};
43
44use pulldown_cmark::Parser;
45
46mod writer;
47mod printer;
48
49#[cfg(test)]
50mod tests;
51
52pub use printer::PrettyPrinter;
53
54/// Parses a CommonMark document and returns it as a pretty printed string.
55///
56/// # Examples
57///
58/// ```rust
59/// # use prettify_cmark::prettify;
60/// let output = prettify("Lorem __ipsum__ dolor `sit` amet!");
61/// assert_eq!(output, "Lorem **ipsum** dolor `sit` amet!");
62/// ```
63pub fn prettify(source: &str) -> String {
64 PrettyDisplay(source).to_string()
65}
66
67/// Wrapper that will pretty print the wrapped document when formatted
68/// via `Display`.
69///
70/// # Examples
71///
72/// Via `to_string`:
73///
74/// ```rust
75/// # use prettify_cmark::PrettyDisplay;
76/// let output = PrettyDisplay("Lorem __ipsum__ dolor `sit` amet!").to_string();
77/// assert_eq!(output, "Lorem **ipsum** dolor `sit` amet!");
78/// ```
79///
80/// Via `format!`:
81///
82/// ```rust
83/// # use prettify_cmark::PrettyDisplay;
84/// let output = format!("My document: {}", PrettyDisplay("Lorem __ipsum__ dolor `sit` amet!"));
85/// assert_eq!(output, "My document: Lorem **ipsum** dolor `sit` amet!");
86/// ```
87pub struct PrettyDisplay<T>(pub T);
88
89impl<T: AsRef<str>> Display for PrettyDisplay<T> {
90 fn fmt(&self, fmt: &mut Formatter) -> Result {
91 let events = Parser::new(self.0.as_ref());
92 let mut pretty_printer = PrettyPrinter::new(fmt);
93 pretty_printer.push_events(events)
94 }
95}