private static CssPseudoClass[] ParsePseudoClasses(CssStringStreamReader reader) { var classes = new List <CssPseudoClass>(); while (reader.CurrentChar == ':') { reader.Advance(); if (!reader.TryReadIdentifier(out var className)) { return(null); } if (CssFunctionalPseudoClass.TryConvertToFunctionalPseudoClassType(className, out var functionalClassType)) { if (!reader.Read('(') || !TryParseSelectorList(reader, out var functionalSelectors) || !reader.Read(')')) { return(null); } classes.Add(new CssFunctionalPseudoClass(functionalSelectors, functionalClassType)); continue; } if (CssUserActionPseudoClass.TryConvertToUserActionPseudoClassType(className, out var userActionClassType)) { classes.Add(new CssUserActionPseudoClass(userActionClassType)); continue; } if (CssStructuralPseudoClass.TryConvertToStructuralPseudoClassType(className, out var structuralPseudoClassType)) { if (!reader.Read('(') || !TryParseSelectorList(reader, out var structuralSelectors) || !reader.Read(')')) { structuralSelectors = new CssSelectorList(); } classes.Add(new CssStructuralPseudoClass(structuralSelectors, structuralPseudoClassType)); continue; } return(null); // unknown / unhandled pseudo class } return(classes.ToArray()); }
public static bool TryParseSelectorList(CssStringStreamReader reader, out CssSelectorList selectors) { selectors = new CssSelectorList(); while (!reader.IsEndOfStream) { if (!TryParseComplexSelector(reader, out var complex)) { break; } selectors.Add(Flatten(complex)); reader.SkipWhitespaceAndComments(); if (reader.CurrentChar != ',') { break; } reader.Advance(); } return(selectors.Count > 0); }
public CssStyleRule(CssSelectorList selectors, IReadOnlyDictionary <string, CssStylePropertyValue> properties) { Selectors = selectors ?? throw new ArgumentNullException(nameof(selectors)); Properties = properties ?? throw new ArgumentNullException(nameof(properties)); }
public CssFunctionalPseudoClass(CssSelectorList selectors, CssFunctionalPseudoClassType pseudoClassType) { Selectors = selectors ?? throw new ArgumentNullException(nameof(selectors)); FunctionalPseudoClassType = pseudoClassType; }