Attr
Represents a generic node attribute.
using AngleSharp.Html;
using System;
using System.Text;
namespace AngleSharp.Dom
{
internal sealed class Attr : IAttr, IEquatable<IAttr>
{
private readonly Element _container;
private readonly string _localName;
private readonly string _prefix;
private readonly string _namespace;
private string _value;
public string Prefix => _prefix;
public bool IsId {
get {
if (_prefix == null)
return _localName.Equals(AttributeNames.Id, StringComparison.OrdinalIgnoreCase);
return false;
}
}
public bool Specified => !string.IsNullOrEmpty(_value);
public string Name {
get {
if (_prefix != null)
return _prefix + ":" + _localName;
return _localName;
}
}
public string Value {
get {
return _value;
}
set {
string value2 = _value;
_value = value;
_container.AttributeChanged(_localName, _namespace, value2, false);
}
}
public string LocalName => _localName;
public string NamespaceUri => _namespace;
internal Attr(Element container, string localName)
: this(container, localName, string.Empty)
{
}
internal Attr(Element container, string localName, string value)
{
_container = container;
_localName = localName;
_value = value;
}
internal Attr(Element container, string prefix, string localName, string value, string namespaceUri)
{
_prefix = prefix;
_localName = localName;
_container = container;
_value = value;
_namespace = namespaceUri;
}
public bool Equals(IAttr other)
{
if (other != this) {
if (_value == other.Value)
return _localName == other.Name;
return false;
}
return true;
}
public override string ToString()
{
StringBuilder stringBuilder = Pool.NewStringBuilder();
if (string.IsNullOrEmpty(_namespace))
stringBuilder.Append(LocalName);
else if (_namespace == Namespaces.XmlUri) {
stringBuilder.Append(Namespaces.XmlPrefix).Append(':').Append(LocalName);
} else if (_namespace == Namespaces.XLinkUri) {
stringBuilder.Append(Namespaces.XLinkPrefix).Append(':').Append(LocalName);
} else if (_namespace == Namespaces.XmlNsUri) {
stringBuilder.Append(XmlNamespaceLocalName());
} else {
stringBuilder.Append(_localName);
}
stringBuilder.Append('=').Append('"');
for (int i = 0; i < _value.Length; i++) {
switch (_value[i]) {
case '&':
stringBuilder.Append("&");
break;
case ' ':
stringBuilder.Append(" ");
break;
case '"':
stringBuilder.Append(""");
break;
default:
stringBuilder.Append(_value[i]);
break;
}
}
return stringBuilder.Append('"').ToPool();
}
private string XmlNamespaceLocalName()
{
if (LocalName != Namespaces.XmlNsPrefix)
return Namespaces.XmlNsPrefix + ":";
return LocalName;
}
}
}