QueryExtensions
Extensions for performing QuerySelector operations.
using AngleSharp.Dom;
using AngleSharp.Dom.Collections;
using AngleSharp.Dom.Css;
using AngleSharp.Parser.Css;
using System.Collections.Generic;
namespace AngleSharp.Extensions
{
internal static class QueryExtensions
{
public static IElement QuerySelector(this INodeList elements, string selectors)
{
ISelector selector = CssParser.Default.ParseSelector(selectors);
Validate(selector);
return elements.QuerySelector(selector);
}
public static HtmlCollection<IElement> QuerySelectorAll(this INodeList elements, string selectors)
{
ISelector selector = CssParser.Default.ParseSelector(selectors);
Validate(selector);
List<IElement> list = new List<IElement>();
elements.QuerySelectorAll(selector, list);
return new HtmlCollection<IElement>(list);
}
public static HtmlCollection<IElement> 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 HtmlCollection<IElement>(list);
}
public static HtmlCollection<IElement> GetElementsByTagName(this INodeList elements, string tagName)
{
List<IElement> list = new List<IElement>();
elements.GetElementsByTagName(tagName.Is(Keywords.Asterisk) ? null : tagName, list);
return new HtmlCollection<IElement>(list);
}
public static HtmlCollection<IElement> GetElementsByTagName(this INodeList elements, string namespaceUri, string localName)
{
List<IElement> list = new List<IElement>();
elements.GetElementsByTagName(namespaceUri, localName.Is(Keywords.Asterisk) ? null : localName, list);
return new HtmlCollection<IElement>(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 HtmlCollection<IElement> QuerySelectorAll(this INodeList elements, ISelector selector)
{
List<IElement> list = new List<IElement>();
elements.QuerySelectorAll(selector, list);
return new HtmlCollection<IElement>(list);
}
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) {
foreach (IElement item in element.DescendentsAndSelf<IElement>()) {
if (selector.Match(item))
result.Add(item);
}
}
}
}
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 || tagName.Isi(element.LocalName))
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.Is(namespaceUri) && (localName == null || localName.Isi(element.LocalName)))
result.Add(element);
if (element.ChildElementCount != 0)
element.ChildNodes.GetElementsByTagName(namespaceUri, localName, result);
}
}
}
private static void Validate(ISelector selector)
{
if (selector == null || selector is UnknownSelector)
throw new DomException(DomError.Syntax);
}
}
}