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}