1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
7pub struct Attribute {
8 pub name: String,
10 pub value: Option<String>,
12 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
14 pub span: Range<usize>,
15}
16
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19#[derive(Clone, Debug, PartialEq, Eq, Hash)]
20pub enum HtmlNode {
21 Element(Element),
23 Text(Text),
25 Comment(String),
27}
28
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31#[derive(Clone, Debug, PartialEq, Eq, Hash)]
32pub struct Element {
33 pub tag_name: String,
35 pub attributes: Vec<Attribute>,
37 pub children: Vec<HtmlNode>,
39 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
41 pub span: Range<usize>,
42}
43
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46#[derive(Clone, Debug, PartialEq, Eq, Hash)]
47pub struct Text {
48 pub content: String,
50 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
52 pub span: Range<usize>,
53}
54
55#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
57#[derive(Clone, Debug, PartialEq, Eq, Hash)]
58pub struct HtmlDocument {
59 pub nodes: Vec<HtmlNode>,
61}