AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.4.1" />

 ElementExtensions

static class 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; } } }