QueryExtensions
Extensions for performing QuerySelector operations.
using AngleSharp.Dom;
using AngleSharp.Dom.Collections;
using AngleSharp.Dom.Css;
using AngleSharp.Parser.Css;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace AngleSharp.Extensions
{
[DebuggerStepThrough]
internal static class QueryExtensions
{
public static IElement QuerySelector(this INodeList elements, string selectors)
{
ISelector selector = CssParser.ParseSelector(selectors, null);
if (selector == null)
throw new DomException(ErrorCode.Syntax);
return elements.QuerySelector(selector);
}
public static HtmlElementCollection QuerySelectorAll(this INodeList elements, string selectors)
{
ISelector selector = CssParser.ParseSelector(selectors, null);
if (selector == null)
throw new DomException(ErrorCode.Syntax);
List<IElement> list = new List<IElement>();
elements.QuerySelectorAll(selector, list);
return new HtmlElementCollection(list);
}
public static HtmlElementCollection QuerySelectorAll(this INodeList elements, ISelector selector)
{
List<IElement> list = new List<IElement>();
elements.QuerySelectorAll(selector, list);
return new HtmlElementCollection(list);
}
public static HtmlElementCollection GetElementsByClassName(this INodeList elements, string classNames)
{
List<IElement> list = new List<IElement>();
string[] array = classNames.SplitSpaces();
if (array.Length != 0)
elements.GetElementsByClassName(array, list);
return new HtmlElementCollection(list);
}
public static HtmlElementCollection GetElementsByTagName(this INodeList elements, string tagName)
{
List<IElement> list = new List<IElement>();
elements.GetElementsByTagName((tagName != "*") ? tagName : null, list);
return new HtmlElementCollection(list);
}
public static HtmlElementCollection GetElementsByTagName(this INodeList elements, string namespaceUri, string localName)
{
List<IElement> list = new List<IElement>();
elements.GetElementsByTagName(namespaceUri, (localName != "*") ? localName : null, list);
return new HtmlElementCollection(list);
}
public static T QuerySelector<T>(this INodeList elements, ISelector selectors) where T : class, IElement
{
return elements.QuerySelector(selectors) as T;
}
public static IElement QuerySelector(this INodeList elements, ISelector selector)
{
for (int i = 0; i < elements.Length; i++) {
IElement element = elements[i] as IElement;
if (element != null) {
if (selector.Match(element))
return element;
if (element.HasChildNodes) {
element = element.ChildNodes.QuerySelector(selector);
if (element != null)
return element;
}
}
}
return null;
}
public static void QuerySelectorAll(this INodeList elements, ISelector selector, List<IElement> result)
{
for (int i = 0; i < elements.Length; i++) {
IElement element = elements[i] as IElement;
if (element != null) {
if (selector.Match(element))
result.Add(element);
if (element.HasChildNodes)
element.ChildNodes.QuerySelectorAll(selector, result);
}
}
}
public static bool Contains(this ITokenList list, string[] tokens)
{
for (int i = 0; i < tokens.Length; i++) {
if (!list.Contains(tokens[i]))
return false;
}
return true;
}
public static void GetElementsByClassName(this INodeList elements, string[] classNames, List<IElement> result)
{
for (int i = 0; i < elements.Length; i++) {
IElement element = elements[i] as IElement;
if (element != null) {
if (element.ClassList.Contains(classNames))
result.Add(element);
if (element.ChildElementCount != 0)
element.ChildNodes.GetElementsByClassName(classNames, result);
}
}
}
public static void GetElementsByTagName(this INodeList elements, string tagName, List<IElement> result)
{
for (int i = 0; i < elements.Length; i++) {
IElement element = elements[i] as IElement;
if (element != null) {
if (tagName == null || element.NodeName.Equals(tagName, StringComparison.OrdinalIgnoreCase))
result.Add(element);
if (element.ChildElementCount != 0)
element.ChildNodes.GetElementsByTagName(tagName, result);
}
}
}
public static void GetElementsByTagName(this INodeList elements, string namespaceUri, string localName, List<IElement> result)
{
for (int i = 0; i < elements.Length; i++) {
IElement element = elements[i] as IElement;
if (element != null) {
if (element.NamespaceUri == namespaceUri && (localName == null || element.LocalName.Equals(localName, StringComparison.OrdinalIgnoreCase)))
result.Add(element);
if (element.ChildElementCount != 0)
element.ChildNodes.GetElementsByTagName(namespaceUri, localName, result);
}
}
}
}
}