use super::renderer::{FrameKind, MarkupRenderer};
use crate::render::format::OutputFormat;
pub(crate) fn render_djot_body<F: OutputFormat<Output = String>>(body: &str, fmt: &F) -> String {
let mut renderer = MarkupRenderer::new(fmt);
for event in jotdown::Parser::new(body) {
match event {
jotdown::Event::Start(container, _attrs) => {
let kind = match container {
jotdown::Container::Document => FrameKind::Root,
jotdown::Container::Paragraph => FrameKind::Paragraph,
jotdown::Container::Blockquote => FrameKind::BlockQuote,
jotdown::Container::List { kind, .. } => match kind {
jotdown::ListKind::Ordered { .. } => FrameKind::OrderedList,
jotdown::ListKind::Unordered(_) | jotdown::ListKind::Task(_) => {
FrameKind::BulletList
}
},
jotdown::Container::ListItem
| jotdown::Container::TaskListItem { .. }
| jotdown::Container::DescriptionDetails => FrameKind::ListItem,
jotdown::Container::Heading { level, .. } => {
FrameKind::Heading { level: level as u8 }
}
jotdown::Container::CodeBlock { language } => {
let lang = if language.is_empty() {
None
} else {
Some(language.to_string())
};
FrameKind::CodeBlock { lang }
}
jotdown::Container::Emphasis => FrameKind::Emph,
jotdown::Container::Strong => FrameKind::Strong,
jotdown::Container::Delete => FrameKind::Strikeout,
jotdown::Container::Link(url, _) => FrameKind::Link {
url: url.to_string(),
},
jotdown::Container::Verbatim => FrameKind::InlineCode,
_ => FrameKind::Transparent,
};
renderer.start_container(kind);
}
jotdown::Event::End(_) => {
renderer.end_container();
}
jotdown::Event::Str(s) => {
if renderer.in_raw_context() {
renderer.push_raw_text(s.to_string());
} else {
renderer.push_text(s.to_string());
}
}
jotdown::Event::Softbreak => {
renderer.push_soft_break();
}
jotdown::Event::Hardbreak => {
renderer.push_hard_break();
}
_ => {}
}
}
renderer.finish()
}