summaryrefslogtreecommitdiff
path: root/htmlua-parser/src/helpers.rs
blob: bd99f81fae8aa3886aabc5c8755eea454bf3df11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use std::{
    fs::File,
    io::{BufRead, BufReader, Read, Seek, SeekFrom},
    path::PathBuf,
};

use anyhow::Result;
use kuchikiki::NodeRef;
use markup5ever::{LocalName, Namespace, QualName};
use tendril::TendrilSink;

pub fn read_doc_from_file(path: PathBuf) -> Result<NodeRef> {
    let mut file = File::open(path)?;
    let mut reader = BufReader::new(&mut file);

    let mut first_line = String::new();
    reader.read_line(&mut first_line)?;
    let first_line_trimmed = first_line.trim();

    let is_whole_doc = first_line_trimmed.eq_ignore_ascii_case("<!DOCTYPE html>");

    file.seek(SeekFrom::Start(0))?;
    let mut page_string = String::new();
    file.read_to_string(&mut page_string)?;

    if is_whole_doc {
        Ok(kuchikiki::parse_html().one(page_string))
    } else {
        let ctx_name = QualName::new(None, Namespace::from("http://www.w3.org/1999/xhtml"), LocalName::from("div"));
        Ok(kuchikiki::parse_fragment(ctx_name, Vec::new()).one(page_string))
    }
}