/// <summary> /// Invoked once a colon has been found in the token enumerator. /// </summary> /// <param name="token">The token.</param> void OnPseudoElement(CssToken token) { state = State.Data; ready = true; if (token.Type == CssTokenType.Ident) { ISelector selector; if (pseudoElementSelectors.TryGetValue(token.Data, out selector)) { if (IsNested) { valid = false; } Insert(selector); return; } Insert(SimpleSelector.PseudoElement(el => false, token.Data)); } valid = false; }
/// <summary> /// Invoked once two colons has been found in the token enumerator. /// </summary> /// <param name="tokens">The token source.</param> /// <returns>The created selector.</returns> public SimpleSelector GetPseudoElement(IEnumerator <CssToken> tokens) { if (tokens.MoveNext() && tokens.Current.Type == CssTokenType.Ident) { var data = ((CssKeywordToken)tokens.Current).Data; switch (data) { case PSEUDOELEMENT_BEFORE: return(SimpleSelector.PseudoElement(MatchBefore, PSEUDOELEMENT_BEFORE)); case PSEUDOELEMENT_AFTER: return(SimpleSelector.PseudoElement(MatchAfter, PSEUDOELEMENT_AFTER)); case PSEUDOELEMENT_SELECTION: return(SimpleSelector.PseudoElement(el => true, PSEUDOELEMENT_SELECTION)); case PSEUDOELEMENT_FIRSTLINE: return(SimpleSelector.PseudoElement(MatchFirstLine, PSEUDOELEMENT_FIRSTLINE)); case PSEUDOELEMENT_FIRSTLETTER: return(SimpleSelector.PseudoElement(MatchFirstLetter, PSEUDOELEMENT_FIRSTLETTER)); } } return(null); }
static CssSelectorConstructor() { pseudoClassSelectors.Add(PseudoClassNames.Root, SimpleSelector.PseudoClass(el => el.Owner.DocumentElement == el, PseudoClassNames.Root)); pseudoClassSelectors.Add(PseudoClassNames.OnlyType, SimpleSelector.PseudoClass(el => el.IsOnlyOfType(), PseudoClassNames.OnlyType)); pseudoClassSelectors.Add(PseudoClassNames.FirstOfType, SimpleSelector.PseudoClass(el => el.IsFirstOfType(), PseudoClassNames.FirstOfType)); pseudoClassSelectors.Add(PseudoClassNames.LastOfType, SimpleSelector.PseudoClass(el => el.IsLastOfType(), PseudoClassNames.LastOfType)); pseudoClassSelectors.Add(PseudoClassNames.OnlyChild, SimpleSelector.PseudoClass(el => el.IsOnlyChild(), PseudoClassNames.OnlyChild)); pseudoClassSelectors.Add(PseudoClassNames.FirstChild, SimpleSelector.PseudoClass(el => el.IsFirstChild(), PseudoClassNames.FirstChild)); pseudoClassSelectors.Add(PseudoClassNames.LastChild, SimpleSelector.PseudoClass(el => el.IsLastChild(), PseudoClassNames.LastChild)); pseudoClassSelectors.Add(PseudoClassNames.Empty, SimpleSelector.PseudoClass(el => el.ChildElementCount == 0 && el.TextContent.Equals(String.Empty), PseudoClassNames.Empty)); pseudoClassSelectors.Add(PseudoClassNames.AnyLink, SimpleSelector.PseudoClass(el => el.IsLink() || el.IsVisited(), PseudoClassNames.AnyLink)); pseudoClassSelectors.Add(PseudoClassNames.Link, SimpleSelector.PseudoClass(el => el.IsLink(), PseudoClassNames.Link)); pseudoClassSelectors.Add(PseudoClassNames.Visited, SimpleSelector.PseudoClass(el => el.IsVisited(), PseudoClassNames.Visited)); pseudoClassSelectors.Add(PseudoClassNames.Active, SimpleSelector.PseudoClass(el => el.IsActive(), PseudoClassNames.Active)); pseudoClassSelectors.Add(PseudoClassNames.Hover, SimpleSelector.PseudoClass(el => el.IsHovered(), PseudoClassNames.Hover)); pseudoClassSelectors.Add(PseudoClassNames.Focus, SimpleSelector.PseudoClass(el => el.IsFocused, PseudoClassNames.Focus)); pseudoClassSelectors.Add(PseudoClassNames.Target, SimpleSelector.PseudoClass(el => el.IsTarget(), PseudoClassNames.Target)); pseudoClassSelectors.Add(PseudoClassNames.Enabled, SimpleSelector.PseudoClass(el => el.IsEnabled(), PseudoClassNames.Enabled)); pseudoClassSelectors.Add(PseudoClassNames.Disabled, SimpleSelector.PseudoClass(el => el.IsDisabled(), PseudoClassNames.Disabled)); pseudoClassSelectors.Add(PseudoClassNames.Default, SimpleSelector.PseudoClass(el => el.IsDefault(), PseudoClassNames.Default)); pseudoClassSelectors.Add(PseudoClassNames.Checked, SimpleSelector.PseudoClass(el => el.IsChecked(), PseudoClassNames.Checked)); pseudoClassSelectors.Add(PseudoClassNames.Indeterminate, SimpleSelector.PseudoClass(el => el.IsIndeterminate(), PseudoClassNames.Indeterminate)); pseudoClassSelectors.Add(PseudoClassNames.PlaceholderShown, SimpleSelector.PseudoClass(el => el.IsPlaceholderShown(), PseudoClassNames.PlaceholderShown)); pseudoClassSelectors.Add(PseudoClassNames.Unchecked, SimpleSelector.PseudoClass(el => el.IsUnchecked(), PseudoClassNames.Unchecked)); pseudoClassSelectors.Add(PseudoClassNames.Valid, SimpleSelector.PseudoClass(el => el.IsValid(), PseudoClassNames.Valid)); pseudoClassSelectors.Add(PseudoClassNames.Invalid, SimpleSelector.PseudoClass(el => el.IsInvalid(), PseudoClassNames.Invalid)); pseudoClassSelectors.Add(PseudoClassNames.Required, SimpleSelector.PseudoClass(el => el.IsRequired(), PseudoClassNames.Required)); pseudoClassSelectors.Add(PseudoClassNames.ReadOnly, SimpleSelector.PseudoClass(el => el.IsReadOnly(), PseudoClassNames.ReadOnly)); pseudoClassSelectors.Add(PseudoClassNames.ReadWrite, SimpleSelector.PseudoClass(el => el.IsEditable(), PseudoClassNames.ReadWrite)); pseudoClassSelectors.Add(PseudoClassNames.InRange, SimpleSelector.PseudoClass(el => el.IsInRange(), PseudoClassNames.InRange)); pseudoClassSelectors.Add(PseudoClassNames.OutOfRange, SimpleSelector.PseudoClass(el => el.IsOutOfRange(), PseudoClassNames.OutOfRange)); pseudoClassSelectors.Add(PseudoClassNames.Optional, SimpleSelector.PseudoClass(el => el.IsOptional(), PseudoClassNames.Optional)); pseudoElementSelectors.Add(PseudoElementNames.Before, SimpleSelector.PseudoElement(el => el.IsPseudo("::" + PseudoElementNames.Before), PseudoElementNames.Before)); pseudoElementSelectors.Add(PseudoElementNames.After, SimpleSelector.PseudoElement(el => el.IsPseudo("::" + PseudoElementNames.After), PseudoElementNames.After)); pseudoElementSelectors.Add(PseudoElementNames.Selection, SimpleSelector.PseudoElement(el => false, PseudoElementNames.Selection)); pseudoElementSelectors.Add(PseudoElementNames.FirstLine, SimpleSelector.PseudoElement(el => el.HasChildNodes && el.ChildNodes[0].NodeType == NodeType.Text, PseudoElementNames.FirstLine)); pseudoElementSelectors.Add(PseudoElementNames.FirstLetter, SimpleSelector.PseudoElement(el => el.HasChildNodes && el.ChildNodes[0].NodeType == NodeType.Text && el.ChildNodes[0].TextContent.Length > 0, PseudoElementNames.FirstLetter)); // LEGACY STYLE OF DEFINING PSEUDO ELEMENTS - AS PSEUDO CLASS! pseudoClassSelectors.Add(PseudoElementNames.Before, pseudoElementSelectors[PseudoElementNames.Before]); pseudoClassSelectors.Add(PseudoElementNames.After, pseudoElementSelectors[PseudoElementNames.After]); pseudoClassSelectors.Add(PseudoElementNames.FirstLine, pseudoElementSelectors[PseudoElementNames.FirstLine]); pseudoClassSelectors.Add(PseudoElementNames.FirstLetter, pseudoElementSelectors[PseudoElementNames.FirstLetter]); pseudoClassFunctions.Add(PseudoClassNames.NthChild, () => new ChildFunctionState <NthFirstChildSelector>(withOptionalSelector: true)); pseudoClassFunctions.Add(PseudoClassNames.NthLastChild, () => new ChildFunctionState <NthLastChildSelector>(withOptionalSelector: true)); pseudoClassFunctions.Add(PseudoClassNames.NthOfType, () => new ChildFunctionState <NthFirstTypeSelector>(withOptionalSelector: false)); pseudoClassFunctions.Add(PseudoClassNames.NthLastOfType, () => new ChildFunctionState <NthLastTypeSelector>(withOptionalSelector: false)); pseudoClassFunctions.Add(PseudoClassNames.NthColumn, () => new ChildFunctionState <NthFirstColumnSelector>(withOptionalSelector: false)); pseudoClassFunctions.Add(PseudoClassNames.NthLastColumn, () => new ChildFunctionState <NthLastColumnSelector>(withOptionalSelector: false)); pseudoClassFunctions.Add(PseudoClassNames.Not, () => new NotFunctionState()); pseudoClassFunctions.Add(PseudoClassNames.Dir, () => new DirFunctionState()); pseudoClassFunctions.Add(PseudoClassNames.Lang, () => new LangFunctionState()); pseudoClassFunctions.Add(PseudoClassNames.Contains, () => new ContainsFunctionState()); pseudoClassFunctions.Add(PseudoClassNames.Has, () => new HasFunctionState()); pseudoClassFunctions.Add(PseudoClassNames.Matches, () => new MatchesFunctionState()); }
/// <summary> /// Creates or gets the associated CSS pseudo element selector. /// </summary> /// <param name="name">The name of the CSS pseudo element.</param> /// <returns>The associated selector.</returns> public ISelector Create(String name) { var selector = default(ISelector); if (selectors.TryGetValue(name, out selector)) { return(selector); } return(SimpleSelector.PseudoElement(el => false, name)); }
/// <summary> /// Invoked once a colon has been found in the token enumerator. /// </summary> /// <param name="token">The token.</param> /// <returns>True if no error occurred, otherwise false.</returns> Boolean OnPseudoElement(CssToken token) { state = State.Data; if (token.Type == CssTokenType.Ident) { var data = token.Data; switch (data) { case pseudoElementBefore: Insert(SimpleSelector.PseudoElement(MatchBefore, pseudoElementBefore)); return(true); case pseudoElementAfter: Insert(SimpleSelector.PseudoElement(MatchAfter, pseudoElementAfter)); return(true); case pseudoElementSelection: Insert(SimpleSelector.PseudoElement(el => true, pseudoElementSelection)); return(true); case pseudoElementFirstLine: Insert(SimpleSelector.PseudoElement(MatchFirstLine, pseudoElementFirstLine)); return(true); case pseudoElementFirstLetter: Insert(SimpleSelector.PseudoElement(MatchFirstLetter, pseudoElementFirstLetter)); return(true); default: Insert(SimpleSelector.PseudoElement(el => false, data)); return(false); } } return(false); }