CharacterData
abstract class CharacterData : Node, ICharacterData, INode, IEventTarget, IMarkupFormattable, IChildNode, INonDocumentTypeChildNode
The base class for all characterdata implementations.
using AngleSharp.Dom.Collections;
using AngleSharp.Extensions;
using AngleSharp.Html;
using System.IO;
namespace AngleSharp.Dom
{
internal abstract class CharacterData : Node, ICharacterData, INode, IEventTarget, IMarkupFormattable, IChildNode, INonDocumentTypeChildNode
{
private string _content;
public IElement PreviousElementSibling {
get {
Node parent = base.Parent;
if (parent != null) {
bool flag = false;
for (int num = parent.ChildNodes.Length - 1; num >= 0; num--) {
if (parent.ChildNodes[num] == this)
flag = true;
else if (flag && parent.ChildNodes[num] is IElement) {
return (IElement)parent.ChildNodes[num];
}
}
}
return null;
}
}
public IElement NextElementSibling {
get {
Node parent = base.Parent;
if (parent != null) {
int length = parent.ChildNodes.Length;
bool flag = false;
for (int i = 0; i < length; i++) {
if (parent.ChildNodes[i] == this)
flag = true;
else if (flag && parent.ChildNodes[i] is IElement) {
return (IElement)parent.ChildNodes[i];
}
}
}
return null;
}
}
internal char this[int index] {
get {
return _content[index];
}
set {
if (index >= 0) {
if (index >= Length)
_content = _content.PadRight(index) + value.ToString();
else {
char[] array = _content.ToCharArray();
array[index] = value;
_content = new string(array);
}
}
}
}
public int Length => _content.Length;
public sealed override string NodeValue {
get {
return Data;
}
set {
Data = value;
}
}
public sealed override string TextContent {
get {
return Data;
}
set {
Data = value;
}
}
public string Data {
get {
return _content;
}
set {
Replace(0, Length, value);
}
}
internal CharacterData(Document owner, string name, NodeType type)
: this(owner, name, type, string.Empty)
{
}
internal CharacterData(Document owner, string name, NodeType type, string content)
: base(owner, name, type, NodeFlags.None)
{
_content = content;
}
public string Substring(int offset, int count)
{
int length = _content.Length;
if (offset > length)
throw new DomException(DomError.IndexSizeError);
if (offset + count > length)
return _content.Substring(offset);
return _content.Substring(offset, count);
}
public void Append(string value)
{
Replace(_content.Length, 0, value);
}
public void Insert(int offset, string data)
{
Replace(offset, 0, data);
}
public void Delete(int offset, int count)
{
Replace(offset, count, string.Empty);
}
public void Replace(int offset, int count, string data)
{
Document owner = base.Owner;
int length = _content.Length;
if (offset > length)
throw new DomException(DomError.IndexSizeError);
if (offset + count > length)
count = length - offset;
owner.QueueMutation(MutationRecord.CharacterData(this, _content));
int startIndex = offset + data.Length;
_content = _content.Insert(offset, data).Remove(startIndex, count);
owner.ForEachRange(delegate(Range m) {
if (m.Head == this && m.Start > offset)
return m.Start <= offset + count;
return false;
}, delegate(Range m) {
m.StartWith(this, offset);
});
owner.ForEachRange(delegate(Range m) {
if (m.Tail == this && m.End > offset)
return m.End <= offset + count;
return false;
}, delegate(Range m) {
m.EndWith(this, offset);
});
owner.ForEachRange(delegate(Range m) {
if (m.Head == this)
return m.Start > offset + count;
return false;
}, delegate(Range m) {
m.StartWith(this, m.Start + data.Length - count);
});
owner.ForEachRange(delegate(Range m) {
if (m.Tail == this)
return m.End > offset + count;
return false;
}, delegate(Range m) {
m.EndWith(this, m.End + data.Length - count);
});
}
public override void ToHtml(TextWriter writer, IMarkupFormatter formatter)
{
writer.Write(formatter.Text(_content));
}
public void Before(params INode[] nodes)
{
this.InsertBefore(nodes);
}
public void After(params INode[] nodes)
{
this.InsertAfter(nodes);
}
public void Replace(params INode[] nodes)
{
this.ReplaceWith(nodes);
}
public void Remove()
{
this.RemoveFromParent();
}
}
}