diff --git a/default_environment/templates/html/line_break.dust b/default_environment/templates/html/line_break.dust index 8749759..1915ec1 100644 --- a/default_environment/templates/html/line_break.dust +++ b/default_environment/templates/html/line_break.dust @@ -1 +1 @@ -line_break +
diff --git a/default_environment/templates/html/plain_list.dust b/default_environment/templates/html/plain_list.dust index 56e8975..fdc240e 100644 --- a/default_environment/templates/html/plain_list.dust +++ b/default_environment/templates/html/plain_list.dust @@ -1 +1,6 @@ -plain_list +{@select key=.list_type} + {@eq value="unordered"}{/eq} + {@eq value="ordered"}
    {#.children}{>plain_list_item/}{/.children}
{/eq} + {@eq value="descriptive"}
{#.children}{>plain_list_item/}{/.children}
{/eq} + {@none}{!TODO: make this panic!}ERROR: Unrecognized list type {.list_type}.{/none} +{/select} diff --git a/default_environment/templates/html/plain_list_item.dust b/default_environment/templates/html/plain_list_item.dust new file mode 100644 index 0000000..8634420 --- /dev/null +++ b/default_environment/templates/html/plain_list_item.dust @@ -0,0 +1,6 @@ +{@select key=list_type} + {@eq value="unordered"}
  • {#.children}{>element/}{/.children}
  • {/eq} + {@eq value="ordered"}
  • {#.children}{>element/}{/.children}
  • {/eq} + {@eq value="descriptive"}
    {#.tag}{>object/}{/.tag}
    {#.children}{>element/}{/.children}
    {/eq} + {@none}{!TODO: make this panic!}ERROR: Unrecognized list type {.list_type}.{/none} +{/select} diff --git a/src/context/mod.rs b/src/context/mod.rs index 7c50714..25ae64c 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -36,6 +36,7 @@ mod org_macro; mod paragraph; mod plain_link; mod plain_list; +mod plain_list_item; mod plain_text; mod planning; mod property_drawer; diff --git a/src/context/plain_list.rs b/src/context/plain_list.rs index 8c239f4..b6b61b9 100644 --- a/src/context/plain_list.rs +++ b/src/context/plain_list.rs @@ -6,10 +6,15 @@ use crate::config::Config; use crate::error::CustomError; use crate::intermediate::IPlainList; +use super::plain_list_item::RenderPlainListItem; + #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "plain_list")] -pub(crate) struct RenderPlainList {} +pub(crate) struct RenderPlainList { + list_type: String, + children: Vec, +} impl RenderPlainList { pub(crate) fn new( @@ -18,6 +23,27 @@ impl RenderPlainList { output_file: &Path, original: &IPlainList, ) -> Result { - Ok(RenderPlainList {}) + let list_type = match original.list_type { + organic::types::PlainListType::Unordered => "unordered".to_owned(), + organic::types::PlainListType::Ordered => "ordered".to_owned(), + organic::types::PlainListType::Descriptive => "descriptive".to_owned(), + }; + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(RenderPlainListItem::new( + config, + &output_directory, + &output_file, + obj, + )?); + } + ret + }; + + Ok(RenderPlainList { + list_type, + children, + }) } } diff --git a/src/context/plain_list_item.rs b/src/context/plain_list_item.rs new file mode 100644 index 0000000..0cfe106 --- /dev/null +++ b/src/context/plain_list_item.rs @@ -0,0 +1,54 @@ +use std::path::Path; + +use serde::Serialize; + +use crate::config::Config; +use crate::error::CustomError; +use crate::intermediate::IPlainListItem; + +use super::RenderElement; +use super::RenderObject; + +#[derive(Debug, Serialize)] +#[serde(tag = "type")] +#[serde(rename = "plain_list_item")] +pub(crate) struct RenderPlainListItem { + tag: Vec, + children: Vec, +} + +impl RenderPlainListItem { + pub(crate) fn new( + config: &Config, + output_directory: &Path, + output_file: &Path, + original: &IPlainListItem, + ) -> Result { + let tag = { + let mut ret = Vec::new(); + for obj in original.tag.iter() { + ret.push(RenderObject::new( + config, + &output_directory, + &output_file, + obj, + )?); + } + ret + }; + + let children = { + let mut ret = Vec::new(); + for obj in original.children.iter() { + ret.push(RenderElement::new( + config, + &output_directory, + &output_file, + obj, + )?); + } + ret + }; + Ok(RenderPlainListItem { tag, children }) + } +} diff --git a/src/intermediate/mod.rs b/src/intermediate/mod.rs index af8cb43..ac1f411 100644 --- a/src/intermediate/mod.rs +++ b/src/intermediate/mod.rs @@ -37,6 +37,7 @@ mod page; mod paragraph; mod plain_link; mod plain_list; +mod plain_list_item; mod plain_text; mod planning; mod property_drawer; @@ -98,6 +99,7 @@ pub(crate) use page::BlogPostPage; pub(crate) use paragraph::IParagraph; pub(crate) use plain_link::IPlainLink; pub(crate) use plain_list::IPlainList; +pub(crate) use plain_list_item::IPlainListItem; pub(crate) use plain_text::IPlainText; pub(crate) use planning::IPlanning; pub(crate) use property_drawer::IPropertyDrawer; diff --git a/src/intermediate/plain_list.rs b/src/intermediate/plain_list.rs index 3b1eac8..2065403 100644 --- a/src/intermediate/plain_list.rs +++ b/src/intermediate/plain_list.rs @@ -1,15 +1,30 @@ use crate::error::CustomError; use super::registry::Registry; +use super::IPlainListItem; #[derive(Debug)] -pub(crate) struct IPlainList {} +pub(crate) struct IPlainList { + pub(crate) list_type: organic::types::PlainListType, + pub(crate) children: Vec, +} impl IPlainList { pub(crate) async fn new<'parse>( registry: &mut Registry<'parse>, plain_list: &organic::types::PlainList<'parse>, ) -> Result { - Ok(IPlainList {}) + let children = { + let mut ret = Vec::new(); + for obj in plain_list.children.iter() { + ret.push(IPlainListItem::new(registry, obj).await?); + } + ret + }; + + Ok(IPlainList { + list_type: plain_list.list_type, + children, + }) } } diff --git a/src/intermediate/plain_list_item.rs b/src/intermediate/plain_list_item.rs new file mode 100644 index 0000000..8a77b9a --- /dev/null +++ b/src/intermediate/plain_list_item.rs @@ -0,0 +1,36 @@ +use crate::error::CustomError; + +use super::registry::Registry; +use super::IElement; +use super::IObject; + +#[derive(Debug)] +pub(crate) struct IPlainListItem { + pub(crate) tag: Vec, + pub(crate) children: Vec, +} + +impl IPlainListItem { + pub(crate) async fn new<'parse>( + registry: &mut Registry<'parse>, + plain_list_item: &organic::types::PlainListItem<'parse>, + ) -> Result { + let tag = { + let mut ret = Vec::new(); + for obj in plain_list_item.tag.iter() { + ret.push(IObject::new(registry, obj).await?); + } + ret + }; + + let children = { + let mut ret = Vec::new(); + for elem in plain_list_item.children.iter() { + ret.push(IElement::new(registry, elem).await?); + } + ret + }; + + Ok(IPlainListItem { tag, children }) + } +}