mdxt/render/
mod.rs

1pub mod render_option;
2pub mod render_result;
3
4use crate::ast::{AST, line::code_to_lines};
5use crate::container::metadata::parse_metadata;
6use crate::escape::{escape_backslashes, preprocess, render_html_escapes};
7use crate::utils::from_v32;
8use render_option::RenderOption;
9use render_result::RenderResult;
10
11pub fn render_to_html_with_default_options(content: &str) -> String {
12    render_to_html(content, RenderOption::default()).content
13}
14
15pub fn render_to_html(content: &str, mut options: RenderOption) -> RenderResult {
16    let mut u32_content = preprocess(content);
17    u32_content = escape_backslashes(&u32_content);
18
19    let mut metadata = None;
20
21    let mut lines = code_to_lines(&u32_content);
22
23    if options.parse_metadata {
24
25        if let Some((parsed_metadata, end_index)) = parse_metadata(&lines) {
26            metadata = Some(parsed_metadata);
27            lines = lines[end_index + 1..].to_vec();
28        }
29
30    }
31
32    let mut ast = AST::from_lines(lines, &mut options);
33
34    let html = ast.to_html();
35
36    let clean_html = render_html_escapes(&html);
37
38    let fenced_code_contents = ast.doc_data.fenced_code_contents.iter().map(
39        |(index, content)| (*index, from_v32(content))
40    ).collect();
41
42    RenderResult {
43        content: from_v32(&clean_html),
44        has_collapsible_table: ast.doc_data.has_collapsible_table,
45        has_tooltip: ast.doc_data.tooltip_count > 0,
46        has_sidebar: !ast.sidebar.is_empty(),
47        metadata,
48        fenced_code_contents
49    }
50
51}