diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 3d71db75..4e9d3355 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -15,7 +15,7 @@ mod identifier; pub use identifier::IdentifierValue; mod classes; -pub use classes::{Classes, ClassesOp}; +pub use classes::{Classes, ClassesOp, ClassValue}; mod unit; pub use unit::UnitValue; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index a3766c59..2bc8421e 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,11 +1,14 @@ use crate::concat_string; +pub type ClassValue = &'static str; + pub enum ClassesOp { Add, - AddAfter(&'static str), - AddBefore(&'static str), + AddAfter(ClassValue), + AddBefore(ClassValue), AddFirst, - Replace(&'static str), + Remove, + Replace(ClassValue), Reset, SetDefault, SetDefaultIfEmpty, @@ -59,6 +62,17 @@ impl Classes { self.added = concat_string!(classes, " ", self.added).trim().to_owned() }, + ClassesOp::Remove => { + let v_list: Vec<&str> = classes.split_ascii_whitespace().collect(); + let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); + for class in v_list { + if let Some(pos) = v_added.iter().position(|c| c.eq(&class)) { + v_added.remove(pos); + } + } + self.added = v_added.join(" "); + }, + ClassesOp::Replace(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); match v_added.iter().position(|c| c.eq(&class)) {