Skip to main content

sevenmark_html/render/
element.rs

1//! Element-level rendering
2
3use maud::{Markup, html};
4use sevenmark_parser::ast::Element;
5
6use super::{brace, bracket, r#macro, markdown, mention, text};
7use crate::context::RenderContext;
8
9/// Render multiple elements
10pub 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
18/// Render a single element (dispatch to specific renderers)
19pub fn render_element(el: &Element, ctx: &mut RenderContext) -> Markup {
20    match el {
21        // Text elements
22        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        // Markdown text styles
28        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        // Header (handled by section tree, should not appear in content)
46        Element::Header(_) => html! {},
47
48        // Block elements
49        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        // Container elements
64        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        // Media
76        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        // External Media (YouTube, Vimeo, NicoNico, Spotify)
85        Element::ExternalMedia(ext_media) => bracket::video::render(
86            &ext_media.span,
87            &ext_media.provider,
88            &ext_media.parameters,
89            ctx,
90        ),
91
92        // Footnotes
93        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        // Line breaks
103        Element::SoftBreak(_) => r#macro::newline::render_soft_break(ctx),
104        Element::HardBreak(_) => r#macro::newline::render_hard_break(),
105
106        // Macros
107        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        // Wiki elements (metadata, not rendered visually)
112        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        // Mentions
120        Element::Mention(mention_el) => mention::mention::render(&mention_el.kind, &mention_el.id),
121
122        Element::Null(_) => html! {},
123    }
124}