summaryrefslogtreecommitdiffstats
path: root/src/resolve.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolve.rs')
-rw-r--r--src/resolve.rs51
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,
}