diff --git a/src/parser/affiliated_keyword.rs b/src/parser/affiliated_keyword.rs index b51b8b4..0f88c77 100644 --- a/src/parser/affiliated_keyword.rs +++ b/src/parser/affiliated_keyword.rs @@ -1,7 +1,23 @@ +use std::collections::BTreeMap; + +use crate::context::GlobalSettings; +use crate::types::AffiliatedKeywordValue; +use crate::types::AffiliatedKeywords; use crate::types::Keyword; use crate::types::Object; use crate::types::PlainList; +pub(crate) fn parse_affiliated_keywords<'g, 's>( + global_settings: &'g GlobalSettings<'g, 's>, + input: Vec>, +) -> AffiliatedKeywords<'s> { + let mut ret = BTreeMap::new(); + for kw in input.into_iter() { + // foo + } + AffiliatedKeywords { keywords: ret } +} + // pub struct AffiliatedKeyword<'s> { // name: &'s str, // } diff --git a/src/parser/plain_list.rs b/src/parser/plain_list.rs index 62a6263..b5f0f83 100644 --- a/src/parser/plain_list.rs +++ b/src/parser/plain_list.rs @@ -18,6 +18,7 @@ use nom::multi::many1; use nom::multi::many_till; use nom::sequence::tuple; +use super::affiliated_keyword::parse_affiliated_keywords; use super::element_parser::element; use super::keyword::affiliated_keyword; use super::object_parser::standard_set_object; @@ -164,7 +165,10 @@ pub(crate) fn plain_list<'b, 'g, 'r, 's>( remaining, PlainList { source: source.into(), - affiliated_keywords, + affiliated_keywords: parse_affiliated_keywords( + context.get_global_settings(), + affiliated_keywords, + ), name, list_type: first_item_list_type.expect("Plain lists require at least one element."), children: children.into_iter().map(|(_start, item)| item).collect(), diff --git a/src/types/affiliated_keyword.rs b/src/types/affiliated_keyword.rs new file mode 100644 index 0000000..c16adf5 --- /dev/null +++ b/src/types/affiliated_keyword.rs @@ -0,0 +1,21 @@ +use std::collections::BTreeMap; + +use super::Object; + +#[derive(Debug)] +pub enum AffiliatedKeywordValue<'s> { + SingleString(&'s str), + ListOfStrings(Vec<&'s str>), + ListOfObjects(Vec>), +} + +#[derive(Debug)] +pub struct AffiliatedKeyword<'s> { + pub name: &'s str, + pub value: AffiliatedKeywordValue<'s>, +} + +#[derive(Debug)] +pub struct AffiliatedKeywords<'s> { + pub(crate) keywords: BTreeMap<&'s str, AffiliatedKeywordValue<'s>>, +} diff --git a/src/types/greater_element.rs b/src/types/greater_element.rs index d2aeab4..f2dbfb1 100644 --- a/src/types/greater_element.rs +++ b/src/types/greater_element.rs @@ -1,5 +1,6 @@ use super::element::Element; use super::lesser_element::TableCell; +use super::AffiliatedKeywords; use super::Keyword; use super::Object; use super::StandardProperties; @@ -7,7 +8,7 @@ use super::StandardProperties; #[derive(Debug)] pub struct PlainList<'s> { pub source: &'s str, - pub affiliated_keywords: Vec>, + pub affiliated_keywords: AffiliatedKeywords<'s>, pub name: Option<&'s str>, pub list_type: PlainListType, pub children: Vec>, diff --git a/src/types/mod.rs b/src/types/mod.rs index fc93c5a..506ffe3 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,3 +1,4 @@ +mod affiliated_keyword; mod ast_node; mod document; mod element; @@ -9,6 +10,9 @@ mod object; mod source; mod standard_properties; mod util; +pub use affiliated_keyword::AffiliatedKeyword; +pub use affiliated_keyword::AffiliatedKeywordValue; +pub use affiliated_keyword::AffiliatedKeywords; pub(crate) use ast_node::AstNode; pub use document::Document; pub use document::DocumentElement;