using AngleSharp.Html; using AngleSharp.Dom; using System; using System.Text; namespace Ganss.Xss; /// /// HTML5 markup formatter. Identical to except for < and > which are /// encoded in attribute values. /// public class HtmlFormatter: HtmlMarkupFormatter { /// /// An instance of . /// new public static readonly HtmlFormatter Instance = new (); // disable XML comments warnings #pragma warning disable 1591 protected override string Attribute(IAttr attr) { var namespaceUri = attr.NamespaceUri; var localName = attr.LocalName; var value = attr.Value; var temp = new StringBuilder(); if (String.IsNullOrEmpty(namespaceUri)) { temp.Append(localName); } else if (namespaceUri == NamespaceNames.XmlUri) { temp.Append(NamespaceNames.XmlPrefix).Append(':').Append(localName); } else if (namespaceUri == NamespaceNames.XLinkUri) { temp.Append(NamespaceNames.XLinkPrefix).Append(':').Append(localName); } else if (namespaceUri == NamespaceNames.XmlNsUri) { temp.Append(XmlNamespaceLocalName(localName)); } else { temp.Append(attr.Name); } temp.Append('=').Append('"'); for (var i = 0; i < value.Length; i++) { switch (value[i]) { case '&': temp.Append("&"); break; case '\u00a0': temp.Append(" "); break; case '"': temp.Append("""); break; case '<': temp.Append("<"); break; case '>': temp.Append(">"); break; default: temp.Append(value[i]); break; } } return temp.Append('"').ToString(); } #pragma warning restore 1591 }