mod block;
pub mod config;
mod inline;
#[cfg(test)]
mod tests;
use crate::ast::*;
use config::Config;
use pretty::{Arena, DocBuilder};
use std::collections::HashMap;
pub(crate) struct State<'a> {
arena: Arena<'a>,
config: Config,
footnote_index: HashMap<String, usize>,
}
impl State<'_> {
pub fn new(config: Config, ast: &Document) -> Self {
let footnote_index = crate::ast::index::get_footnote_indices(ast);
let arena = Arena::new();
Self {
arena,
config,
footnote_index,
}
}
pub fn get_footnote_index(&self, label: &str) -> Option<&usize> {
self.footnote_index.get(label)
}
}
pub fn render_plaintext(ast: &Document, config: Config) -> String {
let state = State::new(config, ast);
let doc = ast.to_doc(&state);
let mut buf = Vec::new();
doc.render(state.config.width, &mut buf)
.expect("Vec<u8> write is infallible");
String::from_utf8(buf).expect("pretty crate always produces valid UTF-8")
}
trait ToDoc<'a> {
fn to_doc(&self, state: &'a State<'a>) -> DocBuilder<'a, Arena<'a>, ()>;
}
impl<'a> ToDoc<'a> for Document {
fn to_doc(&self, state: &'a State<'a>) -> DocBuilder<'a, Arena<'a>, ()> {
self.blocks.to_doc(state)
}
}