diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index 3516d15..0cb9190 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/mod.rs @@ -59,6 +59,7 @@ mod subscript; mod superscript; mod table; mod table_cell; +mod table_group; mod table_row; mod target; mod timestamp; diff --git a/src/intermediate/table.rs b/src/intermediate/table.rs index bfaef7a..85ad76b 100644 --- a/src/intermediate/table.rs +++ b/src/intermediate/table.rs @@ -1,11 +1,12 @@ use super::macros::intermediate; use super::table_row::ITableRow; use crate::error::CustomError; +use crate::intermediate::table_group::ITableGroup; use organic::types::StandardProperties; #[derive(Debug, Clone)] pub(crate) struct ITable { - pub(crate) children: Vec, + pub(crate) children: Vec, pub(crate) post_blank: organic::types::PostBlank, } @@ -21,10 +22,34 @@ intermediate!( let sections = group_into_sections(&original.children); - let children = { + let children = if sections.len() == 1 { + // If there is only one section, then it is a body. let mut ret = Vec::new(); - for obj in original.children.iter() { - ret.push(ITableRow::new(intermediate_context.clone(), obj).await?); + for group in sections.into_iter() { + let mut rows = Vec::new(); + for obj in group.into_iter() { + rows.push(ITableRow::new(intermediate_context.clone(), obj).await?) + } + ret.push(ITableGroup::Body(rows)); + } + ret + } else { + // If there are more than one section, the first is a head and the rest are body. + let mut ret = Vec::new(); + let mut sections = sections.into_iter(); + if let Some(group) = sections.next() { + let mut rows = Vec::new(); + for obj in group.into_iter() { + rows.push(ITableRow::new(intermediate_context.clone(), obj).await?) + } + ret.push(ITableGroup::Head(rows)); + } + for group in sections { + let mut rows = Vec::new(); + for obj in group.into_iter() { + rows.push(ITableRow::new(intermediate_context.clone(), obj).await?) + } + ret.push(ITableGroup::Body(rows)); } ret }; diff --git a/src/intermediate/table_group.rs b/src/intermediate/table_group.rs new file mode 100644 index 0000000..5822fb2 --- /dev/null +++ b/src/intermediate/table_group.rs @@ -0,0 +1,7 @@ +use super::ITableRow; + +#[derive(Debug, Clone)] +pub(crate) enum ITableGroup { + Head(Vec), + Body(Vec), +}