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