use ego_tree::Tree;
use mdbook_core::book::{Book, Chapter};
use mdbook_core::config::{HtmlConfig, RustEdition};
use mdbook_markdown::{MarkdownOptions, new_cmark_parser};
use std::path::{Path, PathBuf};
mod admonitions;
mod hide_lines;
mod print;
mod serialize;
#[cfg(test)]
mod tests;
mod tokenizer;
mod tree;
pub(crate) use hide_lines::{hide_lines, wrap_rust_main};
pub(crate) use print::render_print_page;
pub(crate) use serialize::serialize;
pub(crate) use tree::{Element, Node};
pub(crate) struct HtmlRenderOptions<'a> {
pub markdown_options: MarkdownOptions,
pub path: &'a Path,
pub edition: Option<RustEdition>,
pub config: &'a HtmlConfig,
}
impl<'a> HtmlRenderOptions<'a> {
pub(crate) fn new(
path: &'a Path,
config: &'a HtmlConfig,
edition: Option<RustEdition>,
) -> HtmlRenderOptions<'a> {
let mut markdown_options = MarkdownOptions::default();
markdown_options.smart_punctuation = config.smart_punctuation;
markdown_options.definition_lists = config.definition_lists;
markdown_options.admonitions = config.admonitions;
HtmlRenderOptions {
markdown_options,
path,
edition,
config,
}
}
}
pub(crate) fn render_markdown(text: &str, options: &HtmlRenderOptions<'_>) -> String {
let tree = build_tree(text, options);
let mut output = String::new();
serialize::serialize(&tree, &mut output);
output
}
fn build_tree(text: &str, options: &HtmlRenderOptions<'_>) -> Tree<Node> {
let events = new_cmark_parser(text, &options.markdown_options);
tree::MarkdownTreeBuilder::build(options, events)
}
pub(crate) struct ChapterTree<'book> {
pub(crate) chapter: &'book Chapter,
pub(crate) html_path: PathBuf,
pub(crate) tree: Tree<Node>,
}
pub(crate) fn build_trees<'book>(
book: &'book Book,
html_config: &HtmlConfig,
edition: Option<RustEdition>,
) -> Vec<ChapterTree<'book>> {
book.chapters()
.map(|ch| {
let path = ch.path.as_ref().unwrap();
let html_path = ch.path.as_ref().unwrap().with_extension("html");
let options = HtmlRenderOptions::new(path, html_config, edition);
let tree = build_tree(&ch.content, &options);
ChapterTree {
chapter: ch,
html_path,
tree,
}
})
.collect()
}