node-html-parser 0.1.1

Fast HTML parser for Rust & WASM producing a lightweight DOM with CSS selector querying.
Documentation
use super::main::HTMLElement;

impl HTMLElement {
	fn ensure_class_cache(&mut self) {
		if self.class_cache.is_none() {
			let list = self.get_attribute("class").unwrap_or_default();
			let tokens: Vec<String> = list
				.split_whitespace()
				.filter(|s| !s.is_empty())
				.map(|s| s.to_string())
				.collect();
			self.class_cache = Some(tokens);
		}
	}
	pub fn class_list(&mut self) -> Vec<String> {
		self.ensure_class_cache();
		self.class_cache.clone().unwrap()
	}
	pub fn class_list_view(&self) -> Vec<&str> {
		self.get_attr("class")
			.map(|s| s.split_whitespace().collect())
			.unwrap_or_else(Vec::new)
	}
	pub fn class_list_contains(&mut self, token: &str) -> bool {
		self.ensure_class_cache();
		self.class_cache
			.as_ref()
			.unwrap()
			.iter()
			.any(|c| c == token)
	}
	pub fn class_list_add(&mut self, token: &str) {
		self.ensure_class_cache();
		if let Some(v) = self.class_cache.as_mut() {
			if v.iter().any(|c| c == token) {
				return;
			}
			let mut new_tokens = v.clone();
			new_tokens.push(token.to_string());
			let new_val = new_tokens.join(" ");
			self.set_attributes(&[("class".to_string(), new_val)]);
			self.class_cache = Some(new_tokens);
		}
	}
	pub fn class_list_remove(&mut self, token: &str) {
		self.ensure_class_cache();
		if let Some(v) = self.class_cache.as_mut() {
			if !v.iter().any(|c| c == token) {
				return;
			}
			let new_tokens: Vec<String> =
				v.iter().filter(|c| c.as_str() != token).cloned().collect();
			let new_val = new_tokens.join(" ");
			self.set_attributes(&[("class".to_string(), new_val.clone())]);
			self.class_cache = if new_val.is_empty() {
				None
			} else {
				Some(new_tokens)
			};
		}
	}
	pub fn class_list_toggle(&mut self, token: &str) {
		if self.class_list_contains(token) {
			self.class_list_remove(token);
		} else {
			self.class_list_add(token);
		}
	}
	pub fn class_list_replace(&mut self, old: &str, new: &str) {
		self.ensure_class_cache();
		if let Some(v) = self.class_cache.as_mut() {
			if !v.iter().any(|c| c == old) {
				return;
			}
			let mut new_tokens: Vec<String> = Vec::with_capacity(v.len());
			for c in v.iter() {
				if c == old {
					new_tokens.push(new.to_string());
				} else {
					new_tokens.push(c.clone());
				}
			}
			let new_val = new_tokens.join(" ");
			self.set_attributes(&[("class".to_string(), new_val.clone())]);
			self.class_cache = Some(new_tokens);
		}
	}
}