ElementExtensions
Useful methods for element objects.
using AngleSharp.Dom;
using AngleSharp.Dom.Html;
using AngleSharp.Html;
using AngleSharp.Network;
using System;
using System.Diagnostics;
namespace AngleSharp.Extensions
{
[DebuggerStepThrough]
internal static class ElementExtensions
{
public static string LocatePrefix(this IElement element, string namespaceUri)
{
if (element == null)
return null;
if (element.NamespaceUri == namespaceUri && element.Prefix != null)
return element.Prefix;
foreach (IAttr attribute in element.Attributes) {
if (attribute.Prefix == Namespaces.XmlNsPrefix && attribute.Value == namespaceUri)
return attribute.LocalName;
}
return element.ParentElement.LocatePrefix(namespaceUri);
}
public static string LocateNamespace(this IElement element, string prefix)
{
if (element == null)
return null;
string namespaceUri = element.NamespaceUri;
string prefix2 = element.Prefix;
if (!string.IsNullOrEmpty(namespaceUri) && prefix2 == prefix)
return namespaceUri;
Predicate<IAttr> predicate = (prefix == null) ? ((Predicate<IAttr>)delegate(IAttr attr) {
if (attr.NamespaceUri == Namespaces.XmlNsUri && attr.Prefix == null)
return attr.LocalName == Namespaces.XmlNsPrefix;
return false;
}) : ((Predicate<IAttr>)delegate(IAttr attr) {
if (attr.NamespaceUri == Namespaces.XmlNsUri && attr.Prefix == Namespaces.XmlNsPrefix)
return attr.LocalName == prefix;
return false;
});
foreach (IAttr attribute in element.Attributes) {
if (predicate(attribute)) {
string text = attribute.Value;
if (string.IsNullOrEmpty(text))
text = null;
return text;
}
}
return element.ParentElement.LocateNamespace(prefix);
}
public static ResourceRequest CreateRequestFor(this IElement element, Url url)
{
return new ResourceRequest(element, url);
}
public static bool MatchesCssNamespace(this IElement el, string prefix)
{
if (prefix == "*")
return true;
string a = el.GetAttribute(Namespaces.XmlNsPrefix) ?? el.NamespaceUri;
if (prefix == string.Empty)
return a == string.Empty;
return a == el.GetCssNamespace(prefix);
}
public static string GetCssNamespace(this IElement el, string prefix)
{
return el.Owner.StyleSheets.LocateNamespace(prefix) ?? el.LocateNamespace(prefix);
}
public static bool IsHovered(this IElement element)
{
return false;
}
public static bool IsOnlyOfType(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement == null)
return false;
for (int i = 0; i < parentElement.ChildNodes.Length; i++) {
if (parentElement.ChildNodes[i].NodeName == element.NodeName && parentElement.ChildNodes[i] != element)
return false;
}
return true;
}
public static bool IsFirstOfType(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement == null)
return false;
for (int i = 0; i < parentElement.ChildNodes.Length; i++) {
if (parentElement.ChildNodes[i].NodeName == element.NodeName)
return parentElement.ChildNodes[i] == element;
}
return false;
}
public static bool IsLastOfType(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement == null)
return false;
for (int num = parentElement.ChildNodes.Length - 1; num >= 0; num--) {
if (parentElement.ChildNodes[num].NodeName == element.NodeName)
return parentElement.ChildNodes[num] == element;
}
return false;
}
public static bool IsTarget(this IElement element)
{
IDocument owner = element.Owner;
string id = element.Id;
if (owner == null || id == null)
return false;
string hash = owner.Location.Hash;
return string.Compare(id, 0, hash, (hash.Length > 0) ? 1 : 0, 2147483647) == 0;
}
public static bool IsEnabled(this IElement element)
{
if (element is HtmlAnchorElement || element is HtmlAreaElement || element is HtmlLinkElement)
return !string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href));
if (element is HtmlButtonElement)
return !((HtmlButtonElement)element).IsDisabled;
if (element is HtmlInputElement)
return !((HtmlInputElement)element).IsDisabled;
if (element is HtmlSelectElement)
return !((HtmlSelectElement)element).IsDisabled;
if (element is HtmlTextAreaElement)
return !((HtmlTextAreaElement)element).IsDisabled;
if (element is HtmlOptionElement)
return !((HtmlOptionElement)element).IsDisabled;
if (element is HtmlOptionsGroupElement || element is HtmlMenuItemElement || element is HtmlFieldSetElement)
return string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Disabled));
return false;
}
public static bool IsDisabled(this IElement element)
{
if (element is HtmlButtonElement)
return ((HtmlButtonElement)element).IsDisabled;
if (element is HtmlInputElement)
return ((HtmlInputElement)element).IsDisabled;
if (element is HtmlSelectElement)
return ((HtmlSelectElement)element).IsDisabled;
if (element is HtmlTextAreaElement)
return ((HtmlTextAreaElement)element).IsDisabled;
if (element is HtmlOptionElement)
return ((HtmlOptionElement)element).IsDisabled;
if (element is HtmlOptionsGroupElement || element is HtmlMenuItemElement || element is HtmlFieldSetElement)
return !string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Disabled));
return false;
}
public static bool IsDefault(this IElement element)
{
if (element is HtmlButtonElement) {
HtmlButtonElement htmlButtonElement = (HtmlButtonElement)element;
IHtmlFormElement form = htmlButtonElement.Form;
if (form != null)
return true;
} else if (element is HtmlInputElement) {
HtmlInputElement htmlInputElement = (HtmlInputElement)element;
string type = htmlInputElement.Type;
if (type == InputTypeNames.Submit || type == InputTypeNames.Image) {
IHtmlFormElement form2 = htmlInputElement.Form;
if (form2 != null)
return true;
}
} else if (element is HtmlOptionElement) {
return !string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Selected));
}
return false;
}
public static bool IsPseudo(this IElement element, string name)
{
PseudoElement pseudoElement = element as PseudoElement;
if (pseudoElement != null)
return pseudoElement.PseudoName == name;
return false;
}
public static bool IsChecked(this IElement element)
{
if (element is HtmlInputElement) {
HtmlInputElement htmlInputElement = (HtmlInputElement)element;
string type = htmlInputElement.Type;
if (type == InputTypeNames.Checkbox || type == InputTypeNames.Radio)
return htmlInputElement.IsChecked;
return false;
}
if (element is HtmlMenuItemElement) {
HtmlMenuItemElement htmlMenuItemElement = (HtmlMenuItemElement)element;
string type2 = htmlMenuItemElement.Type;
if (type2 == InputTypeNames.Checkbox || type2 == InputTypeNames.Radio)
return htmlMenuItemElement.IsChecked;
return false;
}
if (element is HtmlOptionElement)
return ((HtmlOptionElement)element).IsSelected;
return false;
}
public static bool IsIndeterminate(this IElement element)
{
if (element is HtmlInputElement) {
HtmlInputElement htmlInputElement = (HtmlInputElement)element;
if (htmlInputElement.Type == InputTypeNames.Checkbox)
return htmlInputElement.IsIndeterminate;
return false;
}
if (element is HtmlProgressElement)
return string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Value));
return false;
}
public static bool IsPlaceholderShown(this IElement element)
{
HtmlInputElement htmlInputElement = element as HtmlInputElement;
if (htmlInputElement != null) {
if (!string.IsNullOrEmpty(htmlInputElement.Placeholder))
return string.IsNullOrEmpty(htmlInputElement.Value);
return false;
}
return false;
}
public static bool IsUnchecked(this IElement element)
{
if (element is HtmlInputElement) {
HtmlInputElement htmlInputElement = (HtmlInputElement)element;
string type = htmlInputElement.Type;
if (type == InputTypeNames.Checkbox || type == InputTypeNames.Radio)
return !htmlInputElement.IsChecked;
return false;
}
if (element is HtmlMenuItemElement) {
HtmlMenuItemElement htmlMenuItemElement = (HtmlMenuItemElement)element;
string type2 = htmlMenuItemElement.Type;
if (type2 == InputTypeNames.Checkbox || type2 == InputTypeNames.Radio)
return !htmlMenuItemElement.IsChecked;
return false;
}
if (element is HtmlOptionElement)
return !((HtmlOptionElement)element).IsSelected;
return false;
}
public static bool IsActive(this IElement element)
{
if (element is HtmlAnchorElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlAnchorElement)element).IsActive;
return false;
}
if (element is HtmlAreaElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlAreaElement)element).IsActive;
return false;
}
if (element is HtmlLinkElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlLinkElement)element).IsActive;
return false;
}
if (element is HtmlButtonElement) {
if (!((HtmlButtonElement)element).IsDisabled)
return ((HtmlButtonElement)element).IsActive;
return false;
}
if (element is HtmlInputElement) {
HtmlInputElement htmlInputElement = (HtmlInputElement)element;
string type = htmlInputElement.Type;
if (type == InputTypeNames.Submit || type == InputTypeNames.Image || type == InputTypeNames.Reset || type == InputTypeNames.Button)
return htmlInputElement.IsActive;
return false;
}
if (element is HtmlMenuItemElement) {
if (string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Disabled)))
return ((HtmlMenuItemElement)element).IsActive;
return false;
}
return false;
}
public static bool IsVisited(this IElement element)
{
if (element is HtmlAnchorElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlAnchorElement)element).IsVisited;
return false;
}
if (element is HtmlAreaElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlAreaElement)element).IsVisited;
return false;
}
if (element is HtmlLinkElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return ((HtmlLinkElement)element).IsVisited;
return false;
}
return false;
}
public static bool IsLink(this IElement element)
{
if (element is HtmlAnchorElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return !((HtmlAnchorElement)element).IsVisited;
return false;
}
if (element is HtmlAreaElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return !((HtmlAreaElement)element).IsVisited;
return false;
}
if (element is HtmlLinkElement) {
if (!string.IsNullOrEmpty(element.GetAttribute(null, AttributeNames.Href)))
return !((HtmlLinkElement)element).IsVisited;
return false;
}
return false;
}
public static bool IsOptional(this IElement element)
{
if (element is HtmlInputElement)
return !((HtmlInputElement)element).IsRequired;
if (element is HtmlSelectElement)
return !((HtmlSelectElement)element).IsRequired;
if (element is HtmlTextAreaElement)
return !((HtmlTextAreaElement)element).IsRequired;
return false;
}
public static bool IsRequired(this IElement element)
{
if (element is HtmlInputElement)
return ((HtmlInputElement)element).IsRequired;
if (element is HtmlSelectElement)
return ((HtmlSelectElement)element).IsRequired;
if (element is HtmlTextAreaElement)
return ((HtmlTextAreaElement)element).IsRequired;
return false;
}
public static bool IsInvalid(this IElement element)
{
if (element is IValidation)
return !((IValidation)element).CheckValidity();
if (element is HtmlFormElement)
return !((HtmlFormElement)element).CheckValidity();
return false;
}
public static bool IsValid(this IElement element)
{
if (element is IValidation)
return ((IValidation)element).CheckValidity();
if (element is HtmlFormElement)
return ((HtmlFormElement)element).CheckValidity();
return false;
}
public static bool IsReadOnly(this IElement element)
{
if (element is HtmlInputElement)
return !((HtmlInputElement)element).IsMutable;
if (element is HtmlTextAreaElement)
return !((HtmlTextAreaElement)element).IsMutable;
if (element is IHtmlElement)
return !((IHtmlElement)element).IsContentEditable;
return true;
}
public static bool IsEditable(this IElement element)
{
if (element is HtmlInputElement)
return ((HtmlInputElement)element).IsMutable;
if (element is HtmlTextAreaElement)
return ((HtmlTextAreaElement)element).IsMutable;
if (element is IHtmlElement)
return ((IHtmlElement)element).IsContentEditable;
return false;
}
public static bool IsOutOfRange(this IElement element)
{
IValidation validation = element as IValidation;
if (validation != null) {
IValidityState validity = validation.Validity;
if (!validity.IsRangeOverflow)
return validity.IsRangeUnderflow;
return true;
}
return false;
}
public static bool IsInRange(this IElement element)
{
IValidation validation = element as IValidation;
if (validation != null) {
IValidityState validity = validation.Validity;
if (!validity.IsRangeOverflow)
return !validity.IsRangeUnderflow;
return false;
}
return false;
}
public static bool IsOnlyChild(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement != null && parentElement.ChildElementCount == 1)
return parentElement.FirstElementChild == element;
return false;
}
public static bool IsFirstChild(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement != null)
return parentElement.FirstElementChild == element;
return false;
}
public static bool IsLastChild(this IElement element)
{
IElement parentElement = element.ParentElement;
if (parentElement != null)
return parentElement.LastElementChild == element;
return false;
}
}
}