AngleSharp by Florian Rappl

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

 HtmlParserExtensions

static class HtmlParserExtensions
using AngleSharp.DOM; using AngleSharp.DOM.Html; using AngleSharp.Extensions; using System.Collections.Generic; using System.Diagnostics; namespace AngleSharp.Parser.Html { [DebuggerStepThrough] internal static class HtmlParserExtensions { public static void SetAttributes(this Element element, List<KeyValuePair<string, string>> attributes) { for (int i = 0; i < attributes.Count; i++) { KeyValuePair<string, string> keyValuePair = attributes[i]; element.AddAttribute(keyValuePair.Key, keyValuePair.Value); } } public static void AddFormatting(this List<Element> formatting, Element element) { int num = 0; for (int num2 = formatting.Count - 1; num2 >= 0; num2--) { Element element2 = formatting[num2]; if (element2 == null) break; if (element2.NodeName == element.NodeName && element2.NamespaceUri == element.NamespaceUri && element2.Attributes.AreEqual(element.Attributes) && ++num == 3) { formatting.RemoveAt(num2); break; } } formatting.Add(element); } public static void ClearFormatting(this List<Element> formatting) { while (formatting.Count != 0) { int index = formatting.Count - 1; Element element = formatting[index]; formatting.RemoveAt(index); if (element == null) break; } } public static void AddScopeMarker(this List<Element> formatting) { formatting.Add(null); } public static void AddComment(this Node parent, string data) { parent.AddNode(new Comment(data) { Owner = parent.Owner }); } public static bool IsTableElement(this INode node) { if (!(node is IHtmlTableElement) && !(node is IHtmlTableSectionElement)) return node is IHtmlTableRowElement; return true; } } }