1use maud::{Markup, html};
4use sevenmark_parser::ast::Element;
5
6use super::{brace, bracket, r#macro, markdown, mention, text};
7use crate::context::RenderContext;
8
9pub fn render_elements(elements: &[Element], ctx: &mut RenderContext) -> Markup {
11 html! {
12 @for el in elements {
13 (render_element(el, ctx))
14 }
15 }
16}
17
18pub fn render_element(el: &Element, ctx: &mut RenderContext) -> Markup {
20 match el {
21 Element::Text(text_el) => text::text::render(&text_el.span, &text_el.value, ctx),
23 Element::Escape(escape_el) => text::escape::render(&escape_el.span, &escape_el.value, ctx),
24 Element::Comment(_) => html! {},
25 Element::Error(error_el) => text::error::render(&error_el.value),
26
27 Element::Bold(style_el) => markdown::bold::render(&style_el.span, &style_el.children, ctx),
29 Element::Italic(style_el) => {
30 markdown::italic::render(&style_el.span, &style_el.children, ctx)
31 }
32 Element::Strikethrough(style_el) => {
33 markdown::strikethrough::render(&style_el.span, &style_el.children, ctx)
34 }
35 Element::Underline(style_el) => {
36 markdown::underline::render(&style_el.span, &style_el.children, ctx)
37 }
38 Element::Superscript(style_el) => {
39 markdown::superscript::render(&style_el.span, &style_el.children, ctx)
40 }
41 Element::Subscript(style_el) => {
42 markdown::subscript::render(&style_el.span, &style_el.children, ctx)
43 }
44
45 Element::Header(_) => html! {},
47
48 Element::BlockQuote(bq) => {
50 brace::blockquote::render(&bq.span, &bq.parameters, &bq.children, ctx)
51 }
52 Element::Literal(lit) => brace::literal::render(&lit.span, &lit.children, ctx),
53 Element::Styled(styled) => {
54 brace::styled::render(&styled.span, &styled.parameters, &styled.children, ctx)
55 }
56 Element::Fold(fold) => brace::fold::render(fold, ctx),
57 Element::Ruby(ruby) => {
58 brace::ruby::render(&ruby.span, &ruby.parameters, &ruby.children, ctx)
59 }
60 Element::Code(code) => brace::code::render(&code.span, &code.parameters, &code.value, ctx),
61 Element::TeX(tex) => brace::tex::render(&tex.span, tex.is_block, &tex.value, ctx),
62
63 Element::List(list) => brace::list::render(
65 &list.span,
66 &list.kind,
67 &list.parameters,
68 &list.children,
69 ctx,
70 ),
71 Element::Table(table) => {
72 brace::table::render(&table.span, &table.parameters, &table.children, ctx)
73 }
74
75 Element::Media(media) => bracket::media::render(
77 &media.span,
78 &media.parameters,
79 &media.children,
80 media.resolved_info.as_ref(),
81 ctx,
82 ),
83
84 Element::ExternalMedia(ext_media) => bracket::video::render(
86 &ext_media.span,
87 &ext_media.provider,
88 &ext_media.parameters,
89 ctx,
90 ),
91
92 Element::Footnote(footnote) => brace::footnote::render(
94 &footnote.span,
95 footnote.footnote_index,
96 &footnote.parameters,
97 &footnote.children,
98 ctx,
99 ),
100 Element::FootnoteRef(_) => r#macro::footnote::render(ctx),
101
102 Element::SoftBreak(_) => r#macro::newline::render_soft_break(ctx),
104 Element::HardBreak(_) => r#macro::newline::render_hard_break(),
105
106 Element::HLine(_) => r#macro::hline::render(),
108 Element::TimeNow(_) => r#macro::timenow::render(),
109 Element::Age(age) => r#macro::age::render(&age.date),
110
111 Element::Category(_) => html! {},
113 Element::Redirect(_) => html! {},
114 Element::Include(include) => brace::include::render(&include.span, &include.children, ctx),
115 Element::Define(_) => html! {},
116 Element::Variable(var) => text::variable::render(&var.span, &var.name, ctx),
117 Element::If(_) => html! {},
118
119 Element::Mention(mention_el) => mention::mention::render(&mention_el.kind, &mention_el.id),
121
122 Element::Null(_) => html! {},
123 }
124}