AngleSharp by Florian Rappl

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

 HtmlForeignExtensions

static class HtmlForeignExtensions
A collection of useful helpers when working with foreign content.
using AngleSharp.Dom; using AngleSharp.Html; using System; using System.Collections.Generic; namespace AngleSharp.Parser.Html { internal static class HtmlForeignExtensions { private static readonly Dictionary<string, string> svgAttributeNames = new Dictionary<string, string>(StringComparer.Ordinal) { { "attributename", "attributeName" }, { "attributetype", "attributeType" }, { "basefrequency", "baseFrequency" }, { "baseprofile", "baseProfile" }, { "calcmode", "calcMode" }, { "clippathunits", "clipPathUnits" }, { "contentscripttype", "contentScriptType" }, { "contentstyletype", "contentStyleType" }, { "diffuseconstant", "diffuseConstant" }, { "edgemode", "edgeMode" }, { "externalresourcesrequired", "externalResourcesRequired" }, { "filterres", "filterRes" }, { "filterunits", "filterUnits" }, { "glyphref", "glyphRef" }, { "gradienttransform", "gradientTransform" }, { "gradientunits", "gradientUnits" }, { "kernelmatrix", "kernelMatrix" }, { "kernelunitlength", "kernelUnitLength" }, { "keypoints", "keyPoints" }, { "keysplines", "keySplines" }, { "keytimes", "keyTimes" }, { "lengthadjust", "lengthAdjust" }, { "limitingconeangle", "limitingConeAngle" }, { "markerheight", "markerHeight" }, { "markerunits", "markerUnits" }, { "markerwidth", "markerWidth" }, { "maskcontentunits", "maskContentUnits" }, { "maskunits", "maskUnits" }, { "numoctaves", "numOctaves" }, { "pathlength", "pathLength" }, { "patterncontentunits", "patternContentUnits" }, { "patterntransform", "patternTransform" }, { "patternunits", "patternUnits" }, { "pointsatx", "pointsAtX" }, { "pointsaty", "pointsAtY" }, { "pointsatz", "pointsAtZ" }, { "preservealpha", "preserveAlpha" }, { "preserveaspectratio", "preserveAspectRatio" }, { "primitiveunits", "primitiveUnits" }, { "refx", "refX" }, { "refy", "refY" }, { "repeatcount", "repeatCount" }, { "repeatdur", "repeatDur" }, { "requiredextensions", "requiredExtensions" }, { "requiredfeatures", "requiredFeatures" }, { "specularconstant", "specularConstant" }, { "specularexponent", "specularExponent" }, { "spreadmethod", "spreadMethod" }, { "startoffset", "startOffset" }, { "stddeviation", "stdDeviation" }, { "stitchtiles", "stitchTiles" }, { "surfacescale", "surfaceScale" }, { "systemlanguage", "systemLanguage" }, { "tablevalues", "tableValues" }, { "targetx", "targetX" }, { "targety", "targetY" }, { "textlength", "textLength" }, { "viewbox", "viewBox" }, { "viewtarget", "viewTarget" }, { "xchannelselector", "xChannelSelector" }, { "ychannelselector", "yChannelSelector" }, { "zoomandpan", "zoomAndPan" } }; public static void AdjustAttribute(this Element element, string name, string value) { if (IsXLinkAttribute(name)) element.SetAttribute(Namespaces.XLinkUri, name.Substring(name.IndexOf(':') + 1), value); else if (IsXmlAttribute(name)) { element.SetAttribute(Namespaces.XmlUri, name, value); } else if (IsXmlNamespaceAttribute(name)) { element.SetAttribute(Namespaces.XmlNsUri, name, value); } else { element.SetAttribute(name, value); } } public static string AdjustToMathAttribute(this string attributeName) { if (attributeName.Equals("definitionurl", StringComparison.Ordinal)) return "definitionURL"; return attributeName; } public static string AdjustToSvgAttribute(this string attributeName) { string value = null; if (svgAttributeNames.TryGetValue(attributeName, out value)) return value; return attributeName; } private static bool IsXmlNamespaceAttribute(string name) { if (name.Length > 4) { if (!name.Equals(Namespaces.XmlNsPrefix, StringComparison.Ordinal)) return name.Equals("xmlns:xlink", StringComparison.Ordinal); return true; } return false; } private static bool IsXmlAttribute(string name) { if (name.Length > 7 && string.Compare("xml:", 0, name, 0, 4, StringComparison.Ordinal) == 0) { if (string.Compare(Tags.Base, 0, name, 4, 4, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Lang, 0, name, 4, 4, StringComparison.Ordinal) != 0) return string.Compare(AttributeNames.Space, 0, name, 4, 5, StringComparison.Ordinal) == 0; return true; } return false; } private static bool IsXLinkAttribute(string name) { if (name.Length > 9 && string.Compare("xlink:", 0, name, 0, 6, StringComparison.Ordinal) == 0) { if (string.Compare(AttributeNames.Actuate, 0, name, 6, 7, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Arcrole, 0, name, 6, 7, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Href, 0, name, 6, 4, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Role, 0, name, 6, 4, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Show, 0, name, 6, 4, StringComparison.Ordinal) != 0 && string.Compare(AttributeNames.Type, 0, name, 6, 4, StringComparison.Ordinal) != 0) return string.Compare(AttributeNames.Title, 0, name, 6, 5, StringComparison.Ordinal) == 0; return true; } return false; } } }