HtmlFormatter.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using AngleSharp.Html;
  2. using AngleSharp.Dom;
  3. using System;
  4. using System.Text;
  5. namespace Ganss.Xss;
  6. /// <summary>
  7. /// HTML5 markup formatter. Identical to <see cref="HtmlMarkupFormatter"/> except for &lt; and &gt; which are
  8. /// encoded in attribute values.
  9. /// </summary>
  10. public class HtmlFormatter: HtmlMarkupFormatter
  11. {
  12. /// <summary>
  13. /// An instance of <see cref="HtmlFormatter"/>.
  14. /// </summary>
  15. new public static readonly HtmlFormatter Instance = new ();
  16. // disable XML comments warnings
  17. #pragma warning disable 1591
  18. protected override string Attribute(IAttr attr)
  19. {
  20. var namespaceUri = attr.NamespaceUri;
  21. var localName = attr.LocalName;
  22. var value = attr.Value;
  23. var temp = new StringBuilder();
  24. if (String.IsNullOrEmpty(namespaceUri))
  25. {
  26. temp.Append(localName);
  27. }
  28. else if (namespaceUri == NamespaceNames.XmlUri)
  29. {
  30. temp.Append(NamespaceNames.XmlPrefix).Append(':').Append(localName);
  31. }
  32. else if (namespaceUri == NamespaceNames.XLinkUri)
  33. {
  34. temp.Append(NamespaceNames.XLinkPrefix).Append(':').Append(localName);
  35. }
  36. else if (namespaceUri == NamespaceNames.XmlNsUri)
  37. {
  38. temp.Append(XmlNamespaceLocalName(localName));
  39. }
  40. else
  41. {
  42. temp.Append(attr.Name);
  43. }
  44. temp.Append('=').Append('"');
  45. for (var i = 0; i < value.Length; i++)
  46. {
  47. switch (value[i])
  48. {
  49. case '&': temp.Append("&amp;"); break;
  50. case '\u00a0': temp.Append("&nbsp;"); break;
  51. case '"': temp.Append("&quot;"); break;
  52. case '<': temp.Append("&lt;"); break;
  53. case '>': temp.Append("&gt;"); break;
  54. default: temp.Append(value[i]); break;
  55. }
  56. }
  57. return temp.Append('"').ToString();
  58. }
  59. #pragma warning restore 1591
  60. }