diff --git a/src/markdown.rs b/src/markdown.rs index f5fff41..1604553 100644 --- a/src/markdown.rs +++ b/src/markdown.rs @@ -92,6 +92,8 @@ fn indent_of(content: &str, position: usize, max: usize) -> usize { #[cfg(test)] mod test { + use std::collections::HashMap; + use super::*; use pretty_assertions::assert_eq; @@ -738,6 +740,7 @@ Text title: Some("Admonish".to_owned()), css_id_prefix: None, collapsible: false, + builtins_collapsible: HashMap::default(), }, &CustomDirectiveMap::default(), RenderTextMode::Html, @@ -774,6 +777,7 @@ Text title: Some("Admonish".to_owned()), css_id_prefix: None, collapsible: false, + builtins_collapsible: HashMap::default(), }, &CustomDirectiveMap::default(), RenderTextMode::Html, @@ -930,6 +934,7 @@ Text title: Some("Info".to_owned()), css_id_prefix: Some("".to_owned()), collapsible: false, + builtins_collapsible: HashMap::default(), }, &CustomDirectiveMap::default(), RenderTextMode::Html, @@ -972,6 +977,7 @@ Text title: Some("Info".to_owned()), css_id_prefix: Some("prefix-".to_owned()), collapsible: false, + builtins_collapsible: HashMap::default(), }, &CustomDirectiveMap::default(), RenderTextMode::Html, @@ -1014,6 +1020,7 @@ Text title: Some("Info".to_owned()), css_id_prefix: Some("ignored-prefix-".to_owned()), collapsible: false, + builtins_collapsible: HashMap::default(), }, &CustomDirectiveMap::default(), RenderTextMode::Html, diff --git a/src/resolve.rs b/src/resolve.rs index de630ea..dfd93fb 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -86,15 +86,21 @@ impl AdmonitionMeta { let directive = Directive::from_str(custom_directives, &raw_directive); - // If the directive is a custom one, use collapsible from block, else use default - // value of the custom directive, else use global default value let collapsible = match directive { + // If the directive is a builin one, use collapsible from block, else use default + // value of the builtin directive, else use global default value + Ok(Directive::Builtin(_)) => collapsible.unwrap_or( + *defaults + .builtins_collapsible + .get(&raw_directive) + .unwrap_or(&defaults.collapsible), + ), + // If the directive is a custom one, use collapsible from block, else use default + // value of the custom directive, else use global default value Ok(Directive::Custom(ref custom_dir)) => { - collapsible.unwrap_or(custom_dir.collapsible.unwrap_or(defaults.collapsible)) + collapsible.unwrap_or(custom_dir.collapsible.unwrap_or(defaults.collapsible)) } - _ => { - collapsible.unwrap_or(defaults.collapsible) - } + Err(_) => collapsible.unwrap_or(defaults.collapsible), }; // Load the directive (and title, if one still not given) @@ -151,6 +157,8 @@ fn uppercase_first(input: &str) -> String { #[cfg(test)] mod test { + use std::collections::HashMap; + use super::*; use pretty_assertions::assert_eq; @@ -205,6 +213,7 @@ mod test { title: Some("Important!!!".to_owned()), css_id_prefix: Some("custom-prefix-".to_owned()), collapsible: true, + builtins_collapsible: HashMap::new(), }, &CustomDirectiveMap::default(), ), @@ -233,6 +242,7 @@ mod test { title: Some("Important!!!".to_owned()), css_id_prefix: Some("ignored-custom-prefix-".to_owned()), collapsible: true, + builtins_collapsible: HashMap::new(), }, &CustomDirectiveMap::default(), ), @@ -360,4 +370,63 @@ mod test { collapsible: true, } ); - }} + } + + #[test] + fn test_admonition_info_from_raw_with_collapsible_builtin_directive() { + assert_eq!( + AdmonitionMeta::resolve( + InstanceConfig { + directive: "abstract".to_owned(), + title: None, + id: None, + additional_classnames: Vec::new(), + collapsible: None, + }, + &AdmonitionDefaults { + title: None, + css_id_prefix: None, + collapsible: false, + builtins_collapsible: HashMap::from([("abstract".to_string(), true),]), + }, + &CustomDirectiveMap::default(), + ), + AdmonitionMeta { + directive: "abstract".to_owned(), + title: "Abstract".to_owned(), + css_id: CssId::Prefix("admonition-".to_owned()), + additional_classnames: Vec::new(), + collapsible: true, + } + ); + } + + #[test] + fn test_admonition_info_from_raw_with_non_collapsible_builtin_directive() { + assert_eq!( + AdmonitionMeta::resolve( + InstanceConfig { + directive: "abstract".to_owned(), + title: None, + id: None, + additional_classnames: Vec::new(), + collapsible: None, + }, + &AdmonitionDefaults { + title: None, + css_id_prefix: None, + collapsible: true, + builtins_collapsible: HashMap::from([("abstract".to_string(), false),]), + }, + &CustomDirectiveMap::default(), + ), + AdmonitionMeta { + directive: "abstract".to_owned(), + title: "Abstract".to_owned(), + css_id: CssId::Prefix("admonition-".to_owned()), + additional_classnames: Vec::new(), + collapsible: false, + } + ); + } +} diff --git a/src/types.rs b/src/types.rs index faec313..694d603 100644 --- a/src/types.rs +++ b/src/types.rs @@ -13,6 +13,9 @@ pub(crate) struct AdmonitionDefaults { #[serde(default)] pub(crate) collapsible: bool, + #[serde(default)] + pub(crate) builtins_collapsible: HashMap, + #[serde(default)] pub(crate) css_id_prefix: Option, }