PseudoClassSelectorFactory
Provides string to CSS pseudo class selector instance mappings.
using AngleSharp.Css;
using AngleSharp.Dom;
using AngleSharp.Dom.Css;
using AngleSharp.Extensions;
using System;
using System.Collections.Generic;
namespace AngleSharp.Services.Default
{
public class PseudoClassSelectorFactory : IPseudoClassSelectorFactory
{
private readonly Dictionary<string, ISelector> _selectors = new Dictionary<string, ISelector>(StringComparer.OrdinalIgnoreCase) {
{
PseudoClassNames.Root,
SimpleSelector.PseudoClass((IElement el) => el.Owner.DocumentElement == el, PseudoClassNames.Root)
},
{
PseudoClassNames.Scope,
SimpleSelector.PseudoClass((IElement el) => el.Owner.DocumentElement == el, PseudoClassNames.Scope)
},
{
PseudoClassNames.OnlyType,
SimpleSelector.PseudoClass((IElement el) => el.IsOnlyOfType(), PseudoClassNames.OnlyType)
},
{
PseudoClassNames.FirstOfType,
SimpleSelector.PseudoClass((IElement el) => el.IsFirstOfType(), PseudoClassNames.FirstOfType)
},
{
PseudoClassNames.LastOfType,
SimpleSelector.PseudoClass((IElement el) => el.IsLastOfType(), PseudoClassNames.LastOfType)
},
{
PseudoClassNames.OnlyChild,
SimpleSelector.PseudoClass((IElement el) => el.IsOnlyChild(), PseudoClassNames.OnlyChild)
},
{
PseudoClassNames.FirstChild,
SimpleSelector.PseudoClass((IElement el) => el.IsFirstChild(), PseudoClassNames.FirstChild)
},
{
PseudoClassNames.LastChild,
SimpleSelector.PseudoClass((IElement el) => el.IsLastChild(), PseudoClassNames.LastChild)
},
{
PseudoClassNames.Empty,
SimpleSelector.PseudoClass(delegate(IElement el) {
if (el.ChildElementCount == 0)
return el.TextContent.Is(string.Empty);
return false;
}, PseudoClassNames.Empty)
},
{
PseudoClassNames.AnyLink,
SimpleSelector.PseudoClass(delegate(IElement el) {
if (!el.IsLink())
return el.IsVisited();
return true;
}, PseudoClassNames.AnyLink)
},
{
PseudoClassNames.Link,
SimpleSelector.PseudoClass((IElement el) => el.IsLink(), PseudoClassNames.Link)
},
{
PseudoClassNames.Visited,
SimpleSelector.PseudoClass((IElement el) => el.IsVisited(), PseudoClassNames.Visited)
},
{
PseudoClassNames.Active,
SimpleSelector.PseudoClass((IElement el) => el.IsActive(), PseudoClassNames.Active)
},
{
PseudoClassNames.Hover,
SimpleSelector.PseudoClass((IElement el) => el.IsHovered(), PseudoClassNames.Hover)
},
{
PseudoClassNames.Focus,
SimpleSelector.PseudoClass((IElement el) => el.IsFocused, PseudoClassNames.Focus)
},
{
PseudoClassNames.Target,
SimpleSelector.PseudoClass((IElement el) => el.IsTarget(), PseudoClassNames.Target)
},
{
PseudoClassNames.Enabled,
SimpleSelector.PseudoClass((IElement el) => el.IsEnabled(), PseudoClassNames.Enabled)
},
{
PseudoClassNames.Disabled,
SimpleSelector.PseudoClass((IElement el) => el.IsDisabled(), PseudoClassNames.Disabled)
},
{
PseudoClassNames.Default,
SimpleSelector.PseudoClass((IElement el) => el.IsDefault(), PseudoClassNames.Default)
},
{
PseudoClassNames.Checked,
SimpleSelector.PseudoClass((IElement el) => el.IsChecked(), PseudoClassNames.Checked)
},
{
PseudoClassNames.Indeterminate,
SimpleSelector.PseudoClass((IElement el) => el.IsIndeterminate(), PseudoClassNames.Indeterminate)
},
{
PseudoClassNames.PlaceholderShown,
SimpleSelector.PseudoClass((IElement el) => el.IsPlaceholderShown(), PseudoClassNames.PlaceholderShown)
},
{
PseudoClassNames.Unchecked,
SimpleSelector.PseudoClass((IElement el) => el.IsUnchecked(), PseudoClassNames.Unchecked)
},
{
PseudoClassNames.Valid,
SimpleSelector.PseudoClass((IElement el) => el.IsValid(), PseudoClassNames.Valid)
},
{
PseudoClassNames.Invalid,
SimpleSelector.PseudoClass((IElement el) => el.IsInvalid(), PseudoClassNames.Invalid)
},
{
PseudoClassNames.Required,
SimpleSelector.PseudoClass((IElement el) => el.IsRequired(), PseudoClassNames.Required)
},
{
PseudoClassNames.ReadOnly,
SimpleSelector.PseudoClass((IElement el) => el.IsReadOnly(), PseudoClassNames.ReadOnly)
},
{
PseudoClassNames.ReadWrite,
SimpleSelector.PseudoClass((IElement el) => el.IsEditable(), PseudoClassNames.ReadWrite)
},
{
PseudoClassNames.InRange,
SimpleSelector.PseudoClass((IElement el) => el.IsInRange(), PseudoClassNames.InRange)
},
{
PseudoClassNames.OutOfRange,
SimpleSelector.PseudoClass((IElement el) => el.IsOutOfRange(), PseudoClassNames.OutOfRange)
},
{
PseudoClassNames.Optional,
SimpleSelector.PseudoClass((IElement el) => el.IsOptional(), PseudoClassNames.Optional)
},
{
PseudoClassNames.Shadow,
SimpleSelector.PseudoClass((IElement el) => el.IsShadow(), PseudoClassNames.Shadow)
},
{
PseudoElementNames.Before,
Factory.PseudoElementSelector.Create(PseudoElementNames.Before)
},
{
PseudoElementNames.After,
Factory.PseudoElementSelector.Create(PseudoElementNames.After)
},
{
PseudoElementNames.FirstLine,
Factory.PseudoElementSelector.Create(PseudoElementNames.FirstLine)
},
{
PseudoElementNames.FirstLetter,
Factory.PseudoElementSelector.Create(PseudoElementNames.FirstLetter)
}
};
public void Register(string name, ISelector selector)
{
_selectors.Add(name, selector);
}
public ISelector Unregister(string name)
{
ISelector value = null;
if (_selectors.TryGetValue(name, out value))
_selectors.Remove(name);
return value;
}
protected virtual ISelector CreateDefault(string name)
{
return null;
}
public ISelector Create(string name)
{
ISelector value = null;
if (_selectors.TryGetValue(name, out value))
return value;
return CreateDefault(name);
}
}
}