Open15

html5ever

ピン留めされたアイテム
ken7253ken7253

概要

html5ever はservoで利用されいているRust製のHTMLパーサー

https://github.com/servo/html5ever/tree/main

https://servo.org/

ken7253ken7253

markup5everというクレートも同じリポジトリにあって、これは主にhtml5ever(rcdom)のテストなどに使われる簡易的なDOM操作ができるユーティリティみたいな感じっぽい。

https://github.com/servo/html5ever/tree/main/markup5ever

This crate is built for the express purpose of writing automated tests for the html5ever and xml5ever crates. It is not intended to be a production-quality DOM implementation, and has not been fuzzed or tested against arbitrary, malicious, or nontrivial inputs. No maintenance or support for any such issues will be provided. If you use this DOM implementation in a production, user-facing system, you do so at your own risk.

あくまでテスト用だからこれ使ってブラウザ作らないでねって書いてある。

https://crates.io/crates/markup5ever_rcdom

ken7253ken7253

文字列のHTMLからQuirks Modeを判定する。

HTMLをパースした結果をもとにrcdomを利用して、Quirks Modeを判定してみる。

Quirks Mode is 何?

https://zenn.dev/canalun/articles/domdomtimes_quirks_mode_and_dom

サンプルコード

ken7253ken7253

Quirks Modeかどうかは<!DOCTYPE html>をつけるかどうかの違いでしかないのでそこを書き換えると動作が確認できる。

// => NoQuirks
// let data = "<!DOCTYPE html><html><body><a href=\"foo\"></a></body></html>".to_string();
// => Quirks
let data = "<html><body><a href=\"foo\"></a></body></html>".to_string();
ken7253ken7253
ken7253ken7253

DOMの生成は下記の部分で行われている。
dataはHTMLの文字列でoptsはパース設定なので省略。

    let dom = parse_document(RcDom::default(), opts)
        .from_utf8()
        .read_from(&mut data.as_bytes())
        .unwrap();
ken7253ken7253
ken7253ken7253

ざっと見た感じ、 components/script/dom/* を中心に使われていそう。