markdown_ppp/printer/
mod.rs

1mod block;
2mod blockquote;
3pub mod config;
4mod heading;
5mod inline;
6mod list;
7mod table;
8mod tests;
9
10use crate::ast::*;
11use pretty::{Arena, DocBuilder};
12use std::rc::Rc;
13
14/// Функция, которую вы вызываете, чтобы получить Markdown-строку из AST.
15pub fn render_markdown(ast: &Document, config: crate::printer::config::Config) -> String {
16    let config = Rc::new(config);
17    let arena = Arena::new();
18    let doc = ast.to_doc(config.clone(), &arena);
19
20    let mut buf = Vec::new();
21    doc.render(config.width, &mut buf).unwrap();
22    String::from_utf8(buf).unwrap()
23}
24
25/// Трейт, который конвертирует наши AST-узлы в pretty::Doc
26trait ToDoc<'a> {
27    fn to_doc(
28        &self,
29        config: Rc<crate::printer::config::Config>,
30        arena: &'a Arena<'a>,
31    ) -> DocBuilder<'a, Arena<'a>, ()>;
32}
33
34/// Реализация для корня Document: просто склеиваем все блоки швом из двух переносов строки.
35impl<'a> ToDoc<'a> for Document {
36    fn to_doc(
37        &self,
38        config: Rc<crate::printer::config::Config>,
39        arena: &'a Arena<'a>,
40    ) -> DocBuilder<'a, Arena<'a>, ()> {
41        self.blocks.to_doc(config, arena)
42    }
43}