use {
crate::{
domain::{
at_rules::namespace::{NamespacePrefix, NamespaceUrl, Namespaces},
selectors::{
NonTreeStructuralPseudoClass,
OurSelector,
PseudoElement,
VendorPrefixablePseudoClassName,
VendorPrefixablePseudoElementName,
},
Atom,
VendorPrefix,
},
parsers::OurSelectorParser,
CustomParseError,
},
cssparser::{ParseError, Parser, ParserInput, ToCss},
selectors::SelectorImpl,
std::collections::HashMap,
};
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct OurSelectorImpl;
impl SelectorImpl for OurSelectorImpl {
type ExtraMatchingData = String;
type AttrValue = Atom;
type Identifier = Atom;
type LocalName = Atom;
type NamespacePrefix = NamespacePrefix;
type NamespaceUrl = NamespaceUrl;
type BorrowedNamespaceUrl = str;
type BorrowedLocalName = str;
type NonTSPseudoClass = NonTreeStructuralPseudoClass;
type PseudoElement = PseudoElement;
}
impl OurSelectorImpl {
pub fn parse_selector(
selector_css: &str,
) -> Result<OurSelector, ParseError<CustomParseError>> {
const LineNumberingIsZeroBased: u32 = 0;
let mut parserInput = ParserInput::new_with_line_number_offset(
selector_css,
LineNumberingIsZeroBased,
);
let mut input = Parser::new(&mut parserInput);
let applyVendorPrefixToPseudoClasses = HashMap::default();
let applyVendorPrefixToPseudoElements = HashMap::default();
let ourSelectorParser = OurSelectorParser {
namespaces: Namespaces::empty(),
applyVendorPrefixToPseudoClasses: &applyVendorPrefixToPseudoClasses,
applyVendorPrefixToPseudoElements:
&applyVendorPrefixToPseudoElements,
};
match ourSelectorParser.parse(&mut input) {
Err(error) => Err(error),
Ok(mut selectors) => {
let newSelector = selectors.0.drain(..).next().unwrap();
Ok(newSelector)
}
}
}
#[inline(always)]
pub fn reparse_with_vendor_prefix<'a>(
selector: &OurSelector,
applyVendorPrefixToPseudoClasses: &'a HashMap<
VendorPrefixablePseudoClassName,
VendorPrefix,
>,
applyVendorPrefixToPseudoElements: &'a HashMap<
VendorPrefixablePseudoElementName,
VendorPrefix,
>,
) -> Option<OurSelector> {
const LineNumberingIsZeroBased: u32 = 0;
let originalCss = selector.to_css_string();
let mut parserInput = ParserInput::new_with_line_number_offset(
&originalCss,
LineNumberingIsZeroBased,
);
let mut input = Parser::new(&mut parserInput);
let ourSelectorParser = OurSelectorParser {
namespaces: Namespaces::empty(),
applyVendorPrefixToPseudoClasses,
applyVendorPrefixToPseudoElements,
};
let mut selectors = ourSelectorParser.parse(&mut input).unwrap();
let newSelector = selectors.0.drain(..).next().unwrap();
if newSelector.to_css_string() != originalCss {
Some(newSelector)
} else {
None
}
}
}