TextNode
sealed class TextNode : CharacterData, IText, ICharacterData, INode, IEventTarget, IMarkupFormattable, IChildNode, INonDocumentTypeChildNode
Represents a text node.
using AngleSharp.Dom.Collections;
using AngleSharp.Extensions;
using AngleSharp.Html;
using System.IO;
using System.Text;
namespace AngleSharp.Dom
{
internal sealed class TextNode : CharacterData, IText, ICharacterData, INode, IEventTarget, IMarkupFormattable, IChildNode, INonDocumentTypeChildNode
{
internal bool IsEmpty {
get {
for (int i = 0; i < base.Length; i++) {
if (!base[i].IsSpaceCharacter())
return false;
}
return true;
}
}
public string Text {
get {
Node previousSibling = base.PreviousSibling;
TextNode textNode = this;
StringBuilder stringBuilder = Pool.NewStringBuilder();
while (previousSibling is TextNode) {
textNode = (TextNode)previousSibling;
previousSibling = textNode.PreviousSibling;
}
do {
stringBuilder.Append(textNode.Data);
textNode = (textNode.NextSibling as TextNode);
} while (textNode != null);
return stringBuilder.ToPool();
}
}
public IElement AssignedSlot {
get {
IElement parentElement = base.ParentElement;
if (parentElement.IsShadow())
return parentElement.ShadowRoot.GetAssignedSlot(null);
return null;
}
}
internal TextNode(Document owner)
: this(owner, string.Empty)
{
}
internal TextNode(Document owner, string text)
: base(owner, "#text", NodeType.Text, text)
{
}
public override INode Clone(bool deep = true)
{
TextNode textNode = new TextNode(base.Owner, base.Data);
CloneNode(textNode, deep);
return textNode;
}
public IText Split(int offset)
{
int length = base.Length;
if (offset > length)
throw new DomException(DomError.IndexSizeError);
int count = length - offset;
string text = Substring(offset, count);
TextNode newNode = new TextNode(base.Owner, text);
Node parent = base.Parent;
Document owner = base.Owner;
if (parent != null) {
int index = this.Index();
parent.InsertBefore(newNode, base.NextSibling);
owner.ForEachRange(delegate(Range m) {
if (m.Head == this)
return m.Start > offset;
return false;
}, delegate(Range m) {
m.StartWith(newNode, m.Start - offset);
});
owner.ForEachRange(delegate(Range m) {
if (m.Tail == this)
return m.End > offset;
return false;
}, delegate(Range m) {
m.EndWith(newNode, m.End - offset);
});
owner.ForEachRange(delegate(Range m) {
if (m.Head == parent)
return m.Start == index + 1;
return false;
}, delegate(Range m) {
m.StartWith(parent, m.Start + 1);
});
owner.ForEachRange(delegate(Range m) {
if (m.Tail == parent)
return m.End == index + 1;
return false;
}, delegate(Range m) {
m.StartWith(parent, m.End + 1);
});
}
Replace(offset, count, string.Empty);
if (parent != null) {
owner.ForEachRange(delegate(Range m) {
if (m.Head == this)
return m.Start > offset;
return false;
}, delegate(Range m) {
m.StartWith(this, offset);
});
owner.ForEachRange(delegate(Range m) {
if (m.Tail == this)
return m.End > offset;
return false;
}, delegate(Range m) {
m.EndWith(this, offset);
});
}
return newNode;
}
public override void ToHtml(TextWriter writer, IMarkupFormatter formatter)
{
if (base.Parent != null && (base.Parent.Flags & NodeFlags.LiteralText) == NodeFlags.LiteralText)
writer.Write(base.Data);
else
base.ToHtml(writer, formatter);
}
}
}