summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2023-04-10 09:09:49 +0300
committerLars Wirzenius <liw@liw.fi>2023-04-10 09:09:49 +0300
commitb18280d6f50db17f63838cc365ac2edb89894454 (patch)
tree68749a242b2db172fe2d18ab1185047993015850
parentfddc66ed17d4e63e2c08037b7d223c8811b05dfa (diff)
downloadhtml-page-b18280d6f50db17f63838cc365ac2edb89894454.tar.gz
feat: manipulate classes0.1.0
Sponsored-by: author
-rw-r--r--src/lib.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 8df262e..331c09b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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 &lt;world&gt;</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>,