HtmlForeignExtensions
A collection of useful helpers when working with foreign content.
using AngleSharp.Dom;
using AngleSharp.Extensions;
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.SetOwnAttribute(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;
}
}
}