diff options
author | Lars Wirzenius <liw@liw.fi> | 2023-04-10 09:09:49 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2023-04-10 09:09:49 +0300 |
commit | b18280d6f50db17f63838cc365ac2edb89894454 (patch) | |
tree | 68749a242b2db172fe2d18ab1185047993015850 | |
parent | fddc66ed17d4e63e2c08037b7d223c8811b05dfa (diff) | |
download | html-page-b18280d6f50db17f63838cc365ac2edb89894454.tar.gz |
feat: manipulate classes0.1.0
Sponsored-by: author
-rw-r--r-- | src/lib.rs | 65 |
1 files changed, 65 insertions, 0 deletions
@@ -462,6 +462,12 @@ impl Element { self } + /// Add a class when creating an element. + pub fn with_class(mut self, class: &str) -> Self { + self.add_class(class); + self + } + /// Return the [`Tag`] of the element. pub fn tag(&self) -> Tag { self.tag @@ -505,6 +511,31 @@ impl Element { self.attrs.unset(name); } + /// Return current classes set directly for this element. + pub fn classes(&self) -> impl Iterator<Item = &str> { + let v = if let Some(v) = self.attribute_value("class") { + v + } else { + "" + }; + v.split_ascii_whitespace() + } + + /// Does the element have a class set directly? + pub fn has_class(&self, wanted: &str) -> bool { + self.classes().any(|v| v == wanted) + } + + /// Add a class to the element. This does not replace existing + /// classes. + pub fn add_class(&mut self, class: &str) { + if let Some(old) = self.attribute_value("class") { + self.set_attribute("class", &format!("{old} {class}")); + } else { + self.set_attribute("class", class); + }; + } + /// Append text to element. It will be escaped, if needed, when /// the element is serialized. pub fn push_text(&mut self, text: &str) { @@ -811,6 +842,40 @@ mod test { assert_eq!(e.serialize(), "<P>hello <world></P>"); } + #[test] + fn element_has_no_class_initially() { + let e = Element::new(Tag::P); + assert_eq!(e.attribute_value("class"), None); + assert_eq!(e.classes().next(), None); + assert!(!e.has_class("foo")); + } + + #[test] + fn element_adds_first_class() { + let mut e = Element::new(Tag::P); + e.add_class("foo"); + assert_eq!(e.attribute_value("class"), Some("foo")); + assert!(e.has_class("foo")); + } + + #[test] + fn element_adds_second_class() { + let mut e = Element::new(Tag::P); + e.add_class("foo"); + e.add_class("bar"); + assert_eq!(e.attribute_value("class"), Some("foo bar")); + assert!(e.has_class("foo")); + assert!(e.has_class("bar")); + } + + #[test] + fn creates_classy_element() { + let e = Element::new(Tag::P).with_class("foo").with_class("bar"); + assert_eq!(e.attribute_value("class"), Some("foo bar")); + assert!(e.has_class("foo")); + assert!(e.has_class("bar")); + } + #[derive(Default)] struct Collector { tags: Vec<Tag>, |