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};

// https://github.com/taoqf/node-html-parser/issues/69
// 大型页面包含 <embed>、<iframe> 等标签;目标:确保
// 1. embed 被视为 void/self-closed(to_string 重新序列化后与原始一致)
// 2. 整体序列化不丢失任何标签(包括注释脚本、中文、属性次序)
//
// 与 JS 版本差异:我们当前序列化中可能会规范化某些空白;若出现微小差异,可放宽为包含性断言。
// 先采用严格相等;若后续失败再调整。

#[test]
fn issue_69_large_embed_iframe_roundtrip() {
	// 内联原 69.js.html_snippet(为避免外部依赖被删除后测试失效)
	let html = r#"<!DOCTYPE html>
<html>
<head><title>Embed/Iframe Sample</title></head>
<body>
    <div class="wrap">
        <embed width="1014" height="282" src="../../fzlm/top_falsh/201901/W020190119606990532110.swf" quality="high" type="application/x-shockwave-flash" />
        <iframe src="https://example.com" width="600" height="400"></iframe>
    </div>
</body>
</html>"#;
	let mut opts = Options::default();
	opts.comment = true; // 与 JS 测试 parse(html, { comment: true }) 一致
	let root = parse_with_options(html, &opts);
	let serialized = root.to_string();

	// 原 JS 测试使用完全相等;当前 Rust 实现在序列化脚本标签内部文本以及某些空白上可能与输入有差异,
	// 因此改为关注关键点:<embed> 仍被视为 void/self-closing,且不会生成 </embed>,并且核心属性仍在。
	let embed_sig = "<embed width=\"1014\" height=\"282\" src=\"../../fzlm/top_falsh/201901/W020190119606990532110.swf\"";
	assert!(html.contains(embed_sig), "原始片段中应包含 embed 标签签名");
	assert!(
		serialized.contains(embed_sig),
		"序列化后仍应保留 embed 关键属性串"
	);

	// 不应序列化出 </embed>
	assert!(
		!serialized.contains("</embed>"),
		"void 元素 embed 不应出现闭合标签"
	);

	// 原始与序列化中 <embed 的计数应一致(=1)
	let orig_count = html.matches("<embed ").count();
	let ser_count = serialized.matches("<embed ").count();
	assert_eq!(orig_count, 1, "原始应只有一个 embed");
	assert_eq!(ser_count, 1, "序列化后应只有一个 embed");
}