diff options
Diffstat (limited to 'src/resolve.rs')
-rw-r--r-- | src/resolve.rs | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/resolve.rs b/src/resolve.rs index 93bde90..a933f61 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -1,5 +1,5 @@ use crate::config::InstanceConfig; -use crate::types::{AdmonitionDefaults, Directive}; +use crate::types::{AdmonitionDefaults, CssId, Directive}; use std::str::FromStr; /// All information required to render an admonition. @@ -9,6 +9,7 @@ use std::str::FromStr; pub(crate) struct AdmonitionMeta { pub directive: Directive, pub title: String, + pub css_id: CssId, pub additional_classnames: Vec<String>, pub collapsible: bool, } @@ -28,6 +29,7 @@ impl AdmonitionMeta { let InstanceConfig { directive: raw_directive, title, + id, additional_classnames, collapsible, } = raw; @@ -44,9 +46,22 @@ impl AdmonitionMeta { (Err(_), Some(title)) => (Directive::Note, title), }; + let css_id = if let Some(verbatim) = id { + CssId::Verbatim(verbatim) + } else { + const DEFAULT_CSS_ID_PREFIX: &str = "admonition-"; + CssId::Prefix( + defaults + .css_id_prefix + .clone() + .unwrap_or_else(|| DEFAULT_CSS_ID_PREFIX.to_owned()), + ) + }; + Self { directive, title, + css_id, additional_classnames, collapsible, } @@ -64,7 +79,7 @@ fn format_directive_title(input: &str) -> String { } } -/// Make the first letter of `input` upppercase. +/// Make the first letter of `input` uppercase. /// /// source: https://stackoverflow.com/a/38406885 fn uppercase_first(input: &str) -> String { @@ -99,6 +114,7 @@ mod test { InstanceConfig { directive: " ".to_owned(), title: None, + id: None, additional_classnames: Vec::new(), collapsible: None, }, @@ -107,6 +123,7 @@ mod test { AdmonitionMeta { directive: Directive::Note, title: "Note".to_owned(), + css_id: CssId::Prefix("admonition-".to_owned()), additional_classnames: Vec::new(), collapsible: false, } @@ -120,17 +137,47 @@ mod test { InstanceConfig { directive: " ".to_owned(), title: None, + id: None, + additional_classnames: Vec::new(), + collapsible: None, + }, + &AdmonitionDefaults { + title: Some("Important!!!".to_owned()), + css_id_prefix: Some("custom-prefix-".to_owned()), + collapsible: true, + }, + ), + AdmonitionMeta { + directive: Directive::Note, + title: "Important!!!".to_owned(), + css_id: CssId::Prefix("custom-prefix-".to_owned()), + additional_classnames: Vec::new(), + collapsible: true, + } + ); + } + + #[test] + fn test_admonition_info_from_raw_with_defaults_and_custom_id() { + assert_eq!( + AdmonitionMeta::resolve( + InstanceConfig { + directive: " ".to_owned(), + title: None, + id: Some("my-custom-id".to_owned()), additional_classnames: Vec::new(), collapsible: None, }, &AdmonitionDefaults { title: Some("Important!!!".to_owned()), + css_id_prefix: Some("ignored-custom-prefix-".to_owned()), collapsible: true, }, ), AdmonitionMeta { directive: Directive::Note, title: "Important!!!".to_owned(), + css_id: CssId::Verbatim("my-custom-id".to_owned()), additional_classnames: Vec::new(), collapsible: true, } |