diff --git a/default_environment/templates/html/table.dust b/default_environment/templates/html/table.dust
index 5dbb8fe..a77e7c3 100644
--- a/default_environment/templates/html/table.dust
+++ b/default_environment/templates/html/table.dust
@@ -1 +1 @@
-!!!!!!!! table
+
{#.children}{>table_row/}{/.children}
diff --git a/default_environment/templates/html/table_cell.dust b/default_environment/templates/html/table_cell.dust
new file mode 100644
index 0000000..e7c11ef
--- /dev/null
+++ b/default_environment/templates/html/table_cell.dust
@@ -0,0 +1 @@
+{#.children}{>object/}{/.children} |
diff --git a/default_environment/templates/html/table_row.dust b/default_environment/templates/html/table_row.dust
new file mode 100644
index 0000000..59b2384
--- /dev/null
+++ b/default_environment/templates/html/table_row.dust
@@ -0,0 +1 @@
+{#.children}{>table_cell/}{/.children}
diff --git a/src/context/mod.rs b/src/context/mod.rs
index f6203d8..2c412b3 100644
--- a/src/context/mod.rs
+++ b/src/context/mod.rs
@@ -54,6 +54,8 @@ mod strike_through;
mod subscript;
mod superscript;
mod table;
+mod table_cell;
+mod table_row;
mod target;
mod timestamp;
mod underline;
diff --git a/src/context/table.rs b/src/context/table.rs
index 6b21b74..f460650 100644
--- a/src/context/table.rs
+++ b/src/context/table.rs
@@ -6,11 +6,37 @@ use crate::config::Config;
use crate::error::CustomError;
use crate::intermediate::ITable;
-use super::macros::rnoop;
+use super::macros::render;
+use super::table_row::RenderTableRow;
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "table")]
-pub(crate) struct RenderTable {}
+pub(crate) struct RenderTable {
+ children: Vec,
+}
-rnoop!(RenderTable, ITable);
+render!(
+ RenderTable,
+ ITable,
+ original,
+ config,
+ output_directory,
+ output_file,
+ {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(RenderTableRow::new(
+ config,
+ output_directory,
+ output_file,
+ obj,
+ )?);
+ }
+ ret
+ };
+
+ Ok(RenderTable { children })
+ }
+);
diff --git a/src/context/table_cell.rs b/src/context/table_cell.rs
new file mode 100644
index 0000000..c2cef3c
--- /dev/null
+++ b/src/context/table_cell.rs
@@ -0,0 +1,42 @@
+use std::path::Path;
+
+use serde::Serialize;
+
+use crate::config::Config;
+use crate::error::CustomError;
+use crate::intermediate::ITableCell;
+
+use super::macros::render;
+use super::RenderObject;
+
+#[derive(Debug, Serialize)]
+#[serde(tag = "type")]
+#[serde(rename = "table_cell")]
+pub(crate) struct RenderTableCell {
+ children: Vec,
+}
+
+render!(
+ RenderTableCell,
+ ITableCell,
+ original,
+ config,
+ output_directory,
+ output_file,
+ {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(RenderObject::new(
+ config,
+ output_directory,
+ output_file,
+ obj,
+ )?);
+ }
+ ret
+ };
+
+ Ok(RenderTableCell { children })
+ }
+);
diff --git a/src/context/table_row.rs b/src/context/table_row.rs
new file mode 100644
index 0000000..c4da3a8
--- /dev/null
+++ b/src/context/table_row.rs
@@ -0,0 +1,42 @@
+use std::path::Path;
+
+use serde::Serialize;
+
+use crate::config::Config;
+use crate::error::CustomError;
+use crate::intermediate::ITableRow;
+
+use super::macros::render;
+use super::table_cell::RenderTableCell;
+
+#[derive(Debug, Serialize)]
+#[serde(tag = "type")]
+#[serde(rename = "table_row")]
+pub(crate) struct RenderTableRow {
+ children: Vec,
+}
+
+render!(
+ RenderTableRow,
+ ITableRow,
+ original,
+ config,
+ output_directory,
+ output_file,
+ {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(RenderTableCell::new(
+ config,
+ output_directory,
+ output_file,
+ obj,
+ )?);
+ }
+ ret
+ };
+
+ Ok(RenderTableRow { children })
+ }
+);
diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs
index f228fdb..fd969ef 100644
--- a/src/intermediate/mod.rs
+++ b/src/intermediate/mod.rs
@@ -56,6 +56,8 @@ mod strike_through;
mod subscript;
mod superscript;
mod table;
+mod table_cell;
+mod table_row;
mod target;
mod timestamp;
mod underline;
@@ -119,6 +121,8 @@ pub(crate) use strike_through::IStrikeThrough;
pub(crate) use subscript::ISubscript;
pub(crate) use superscript::ISuperscript;
pub(crate) use table::ITable;
+pub(crate) use table_cell::ITableCell;
+pub(crate) use table_row::ITableRow;
pub(crate) use target::ITarget;
pub(crate) use timestamp::ITimestamp;
pub(crate) use underline::IUnderline;
diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs
index 39ab0df..aeb7f2f 100644
--- a/src/intermediate/table.rs
+++ b/src/intermediate/table.rs
@@ -1,5 +1,21 @@
-use super::macros::inoop;
+use super::macros::intermediate;
+use super::table_row::ITableRow;
use crate::error::CustomError;
-inoop!(ITable, Table);
+#[derive(Debug, Clone)]
+pub(crate) struct ITable {
+ pub(crate) children: Vec,
+}
+
+intermediate!(ITable, Table, original, registry, {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(ITableRow::new(registry.clone(), obj).await?);
+ }
+ ret
+ };
+
+ Ok(ITable { children })
+});
diff --git a/src/intermediate/table_cell.rs b/src/intermediate/table_cell.rs
new file mode 100644
index 0000000..212cf02
--- /dev/null
+++ b/src/intermediate/table_cell.rs
@@ -0,0 +1,21 @@
+use super::macros::intermediate;
+
+use super::IObject;
+use crate::error::CustomError;
+
+#[derive(Debug, Clone)]
+pub(crate) struct ITableCell {
+ pub(crate) children: Vec,
+}
+
+intermediate!(ITableCell, TableCell, original, registry, {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(IObject::new(registry.clone(), obj).await?);
+ }
+ ret
+ };
+
+ Ok(ITableCell { children })
+});
diff --git a/src/intermediate/table_row.rs b/src/intermediate/table_row.rs
new file mode 100644
index 0000000..9628d8e
--- /dev/null
+++ b/src/intermediate/table_row.rs
@@ -0,0 +1,21 @@
+use super::macros::intermediate;
+
+use super::table_cell::ITableCell;
+use crate::error::CustomError;
+
+#[derive(Debug, Clone)]
+pub(crate) struct ITableRow {
+ pub(crate) children: Vec,
+}
+
+intermediate!(ITableRow, TableRow, original, registry, {
+ let children = {
+ let mut ret = Vec::new();
+ for obj in original.children.iter() {
+ ret.push(ITableCell::new(registry.clone(), obj).await?);
+ }
+ ret
+ };
+
+ Ok(ITableRow { children })
+});