lol_html 1.2.1

Streaming HTML rewriter/parser with CSS selector-based API
Documentation
use crate::base::{Align, Range};
use crate::html::{LocalNameHash, Namespace, TextType};
use crate::parser::SharedAttributeBuffer;

#[derive(Debug, Default, Copy, Clone)]
pub struct AttributeOutline {
    pub name: Range,
    pub value: Range,
    pub raw_range: Range,
}

impl Align for AttributeOutline {
    #[inline]
    fn align(&mut self, offset: usize) {
        self.name.align(offset);
        self.value.align(offset);
        self.raw_range.align(offset);
    }
}

#[derive(Debug)]
pub enum TagTokenOutline {
    StartTag {
        name: Range,
        name_hash: LocalNameHash,
        ns: Namespace,
        attributes: SharedAttributeBuffer,
        self_closing: bool,
    },

    EndTag {
        name: Range,
        name_hash: LocalNameHash,
    },
}

#[derive(Debug)]
pub enum NonTagContentTokenOutline {
    Text(TextType),
    Comment(Range),

    Doctype {
        name: Option<Range>,
        public_id: Option<Range>,
        system_id: Option<Range>,
        force_quirks: bool,
    },

    Eof,
}

impl Align for TagTokenOutline {
    #[inline]
    fn align(&mut self, offset: usize) {
        match self {
            TagTokenOutline::StartTag {
                name, attributes, ..
            } => {
                name.align(offset);
                attributes.borrow_mut().align(offset);
            }
            TagTokenOutline::EndTag { name, .. } => name.align(offset),
        }
    }
}

impl Align for NonTagContentTokenOutline {
    #[inline]
    fn align(&mut self, offset: usize) {
        match self {
            NonTagContentTokenOutline::Comment(text) => text.align(offset),
            NonTagContentTokenOutline::Doctype {
                name,
                public_id,
                system_id,
                ..
            } => {
                name.align(offset);
                public_id.align(offset);
                system_id.align(offset);
            }
            _ => (),
        }
    }
}