use super::{ParseOpts, Sink};
use crate::tree::NodeRef;
use std::cell::RefCell;
pub fn parse_html() -> html5ever::Parser<Sink> {
parse_html_with_options(ParseOpts::default())
}
pub fn parse_html_with_options(opts: ParseOpts) -> html5ever::Parser<Sink> {
let sink = Sink {
document_node: NodeRef::new_document(),
on_parse_error: RefCell::new(opts.on_parse_error),
};
let html5opts = html5ever::ParseOpts {
tokenizer: opts.tokenizer,
tree_builder: opts.tree_builder,
};
html5ever::parse_document(sink, html5opts)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::traits::*;
use html5ever::tree_builder::QuirksMode;
use std::path::Path;
#[test]
fn parse_and_serialize() {
let html = r"
<!doctype html>
<title>Test case</title>
<p>Content";
let document = parse_html().one(html);
assert_eq!(
document.as_document().unwrap().quirks_mode(),
QuirksMode::NoQuirks
);
assert_eq!(
document.to_string(),
r"<!DOCTYPE html><html><head><title>Test case</title>
</head><body><p>Content</p></body></html>"
);
}
#[test]
fn parse_and_serialize_with_template() {
let html = r"
<!doctype html>
<title>Test case</title>
<template><p>Content</p></template>";
let document = parse_html().one(html);
assert_eq!(
document.as_document().unwrap().quirks_mode(),
QuirksMode::NoQuirks
);
assert_eq!(
document.to_string(),
r"<!DOCTYPE html><html><head><title>Test case</title>
<template><p>Content</p></template></head><body></body></html>"
);
}
#[test]
fn parse_file() {
let mut path = Path::new(env!("CARGO_MANIFEST_DIR")).to_path_buf();
path.push("test_data");
path.push("foo.html");
let html = r"<!DOCTYPE html><html><head>
<title>Test case</title>
</head>
<body>
<p>Foo</p>
</body></html>";
let document = parse_html().from_utf8().from_file(&path).unwrap();
assert_eq!(document.to_string(), html);
}
}