diff options
Diffstat (limited to 'src/ast.rs')
-rw-r--r-- | src/ast.rs | 37 |
1 files changed, 36 insertions, 1 deletions
@@ -4,7 +4,8 @@ use pandoc_ast::{Attr, Block, Inline, Map, MetaValue, Pandoc}; use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag}; use regex::Regex; use serde::Deserialize; -use std::collections::BTreeMap; +use serde_yaml::{Mapping, Value}; +use std::collections::{BTreeMap, HashMap}; use std::path::{Path, PathBuf}; lazy_static! { @@ -293,6 +294,7 @@ pub struct YamlMetadata { documentclass: Option<String>, #[serde(default)] impls: BTreeMap<String, Vec<PathBuf>>, + pandoc: Option<HashMap<String, Value>>, } impl YamlMetadata { @@ -351,11 +353,44 @@ impl YamlMetadata { map.insert("documentclass".into(), meta_string(v)); } + if let Some(pandoc) = &self.pandoc { + for (key, value) in pandoc.iter() { + map.insert(key.to_string(), value_to_pandoc(value)); + } + } + trace!("Created metadata map from parsed YAML"); map } } +fn mapping_to_pandoc(mapping: &Mapping) -> MetaValue { + let mut map = Map::new(); + for (key, value) in mapping.iter() { + assert!(matches!(key, Value::String(_))); + let key = if let MetaValue::MetaString(s) = value_to_pandoc(&key) { + s + } else { + panic!("key not a string: {:?}", key); + }; + map.insert(key, Box::new(value_to_pandoc(value))); + } + + MetaValue::MetaMap(map) +} + +fn value_to_pandoc(data: &Value) -> MetaValue { + match data { + Value::Null => unreachable!("null not OK"), + Value::Number(_) => unreachable!("number not OK"), + Value::Sequence(_) => unreachable!("sequence not OK"), + + Value::Bool(b) => MetaValue::MetaBool(*b), + Value::String(s) => MetaValue::MetaString(s.clone()), + Value::Mapping(mapping) => mapping_to_pandoc(mapping), + } +} + fn meta_string(s: &str) -> MetaValue { MetaValue::MetaString(s.to_string()) } |