use super::prelude::*;
use crate::tree::{Table, TableType};
use std::num::NonZeroU32;
pub fn render_table(ctx: &mut HtmlContext, table: &Table) {
debug!("Rendering table");
let mut column_span_buf = String::new();
let value_one = NonZeroU32::new(1).unwrap();
let layout = ctx.layout();
let table_class = match (layout, table.table_type) {
(Layout::Wikidot, TableType::Simple) => "wiki-content-table",
(Layout::Wikidot, TableType::Advanced) => "",
(Layout::Wikijump, TableType::Simple) => "wj-table wj-table-simple",
(Layout::Wikijump, TableType::Advanced) => "wj-table wj-table-advanced",
};
let table_attributes = if table_class.is_empty() {
attr!(;; &table.attributes)
} else {
attr!(
"class" => table_class;;
&table.attributes,
)
};
ctx.html().table().attr(table_attributes).inner(|ctx| {
ctx.html().tbody().inner(|ctx| {
for row in &table.rows {
ctx.html()
.tr()
.attr(attr!(;; &row.attributes))
.inner(|ctx| {
for cell in &row.cells {
let elements: &[Element] = &cell.elements;
if cell.column_span > value_one {
column_span_buf.clear();
str_write!(column_span_buf, "{}", cell.column_span);
}
let attributes = match (cell.align, layout) {
(Some(align), Layout::Wikidot) => attr!(
"colspan" => &column_span_buf;
if cell.column_span > value_one,
"style" => align.wd_html_style();;
&cell.attributes,
),
(Some(align), Layout::Wikijump) => attr!(
"colspan" => &column_span_buf;
if cell.column_span > value_one,
"class" => align.wj_html_class();;
&cell.attributes,
),
(None, _) => attr!(
"colspan" => &column_span_buf;
if cell.column_span > value_one;;
&cell.attributes,
),
};
ctx.html()
.table_cell(cell.header)
.attr(attributes)
.contents(elements);
}
});
}
});
});
}