| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- using AngleSharp.Html;
- using AngleSharp.Dom;
- using System;
- using System.Text;
- namespace Ganss.Xss;
- /// <summary>
- /// HTML5 markup formatter. Identical to <see cref="HtmlMarkupFormatter"/> except for < and > which are
- /// encoded in attribute values.
- /// </summary>
- public class HtmlFormatter: HtmlMarkupFormatter
- {
- /// <summary>
- /// An instance of <see cref="HtmlFormatter"/>.
- /// </summary>
- 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
- }
|