diff options
Diffstat (limited to 'src/tokenizer/interface.rs')
-rw-r--r-- | src/tokenizer/interface.rs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/tokenizer/interface.rs b/src/tokenizer/interface.rs index 2c6cc38..f12fb16 100644 --- a/src/tokenizer/interface.rs +++ b/src/tokenizer/interface.rs @@ -9,6 +9,8 @@ use crate::tokenizer::states; use std::borrow::Cow; +#[cfg(feature = "spans")] +use std::ops::Range; pub use self::TagKind::{EndTag, StartTag}; pub use self::Token::{CharacterTokens, CommentToken, DoctypeToken, TagToken}; @@ -47,12 +49,30 @@ pub enum TagKind { /// The tokenizer creates all attributes this way, but the tree /// builder will adjust certain attribute names inside foreign /// content (MathML, SVG). -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)] +#[derive(PartialEq, Eq, Clone, Debug)] pub struct Attribute { /// The name of the attribute (e.g. the `class` in `<div class="test">`) pub name: String, /// The value of the attribute (e.g. the `"test"` in `<div class="test">`) pub value: String, + #[cfg(feature = "spans")] + #[cfg_attr(docsrs, doc(cfg(feature = "spans")))] + pub name_span: Range<usize>, + #[cfg(feature = "spans")] + #[cfg_attr(docsrs, doc(cfg(feature = "spans")))] + pub value_span: Range<usize>, +} + +impl Ord for Attribute { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + (&self.name, &self.value).cmp(&(&other.name, &other.value)) + } +} + +impl PartialOrd for Attribute { + fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { + (&self.name, &self.value).partial_cmp(&(&other.name, &other.value)) + } } /// A tag token. @@ -62,11 +82,14 @@ pub struct Tag { pub name: String, pub self_closing: bool, pub attrs: Vec<Attribute>, + #[cfg(feature = "spans")] + #[cfg_attr(docsrs, doc(cfg(feature = "spans")))] + pub name_span: Range<usize>, } impl Tag { /// Are the tags equivalent when we don't care about attribute order? - /// Also ignores the self-closing flag. + /// Also ignores the self-closing flag and spans. pub fn equiv_modulo_attr_order(&self, other: &Tag) -> bool { if (self.kind != other.kind) || (self.name != other.name) { return false; |