summaryrefslogtreecommitdiff
path: root/src/ast.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.rs')
-rw-r--r--src/ast.rs37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/ast.rs b/src/ast.rs
index 7efe836..531208c 100644
--- a/src/ast.rs
+++ b/src/ast.rs
@@ -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())
}