node-html-parser 0.1.1

Fast HTML parser for Rust & WASM producing a lightweight DOM with CSS selector querying.
Documentation
use node_html_parser::{parse_with_options, Options};

fn first_el(html: &str) -> Box<node_html_parser::HTMLElement> {
	Box::new(
		parse_with_options(html, &Options::default())
			.first_element_child()
			.unwrap()
			.clone(),
	)
}

#[test]
fn attr_transition_duration_literal() {
	let el = first_el("<div x-transition.duration.500ms></div>");
	let mut e = (*el).clone();
	assert_eq!(
		e.get_attribute("x-transition.duration.500ms").as_deref(),
		Some("")
	);
	assert_eq!(el.to_string(), "<div x-transition.duration.500ms></div>");
}

#[test]
fn attr_transition_enter_leave() {
	let el =
		first_el("<div x-transition:enter.duration.500ms x-transition:leave.duration.400ms></div>");
	let mut e = (*el).clone();
	assert_eq!(
		e.get_attribute("x-transition:enter.duration.500ms")
			.as_deref(),
		Some("")
	);
	assert_eq!(
		e.get_attribute("x-transition:leave.duration.400ms")
			.as_deref(),
		Some("")
	);
	assert_eq!(
		el.to_string(),
		"<div x-transition:enter.duration.500ms x-transition:leave.duration.400ms></div>"
	);
}

#[test]
fn attr_click_with_value() {
	let el = first_el("<button @click=\"open = ! open\">Toggle</button>");
	let mut e = (*el).clone();
	assert_eq!(e.get_attribute("@click").as_deref(), Some("open = ! open"));
	assert_eq!(
		el.to_string(),
		"<button @click=\"open = ! open\">Toggle</button>"
	);
}

#[test]
fn attr_many_alpine_like() {
	let html = "<div x-show=\"open\" x-transition:enter=\"transition ease-out duration-300\" x-transition:enter-start=\"opacity-0 scale-90\" x-transition:enter-end=\"opacity-100 scale-100\" x-transition:leave=\"transition ease-in duration-300\" x-transition:leave-start=\"opacity-100 scale-100\" x-transition:leave-end=\"opacity-0 scale-90\">Hello 👋</div>";
	let el = first_el(html);
	let mut e = (*el).clone();
	assert_eq!(e.get_attribute("x-show").as_deref(), Some("open"));
	assert_eq!(
		e.get_attribute("x-transition:enter").as_deref(),
		Some("transition ease-out duration-300")
	);
	assert_eq!(
		e.get_attribute("x-transition:enter-start").as_deref(),
		Some("opacity-0 scale-90")
	);
	assert_eq!(
		e.get_attribute("x-transition:enter-end").as_deref(),
		Some("opacity-100 scale-100")
	);
	assert_eq!(
		e.get_attribute("x-transition:leave").as_deref(),
		Some("transition ease-in duration-300")
	);
	assert_eq!(
		e.get_attribute("x-transition:leave-start").as_deref(),
		Some("opacity-100 scale-100")
	);
	assert_eq!(
		e.get_attribute("x-transition:leave-end").as_deref(),
		Some("opacity-0 scale-90")
	);
	assert_eq!(el.to_string(), html);
}