CssNode
Represents a node in the CSS parse tree.
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace AngleSharp.Dom.Css
{
internal abstract class CssNode : ICssNode, IStyleFormattable
{
private readonly List<ICssNode> _children;
private TextView _source;
public TextView SourceCode {
get {
return _source;
}
internal set {
_source = value;
}
}
public IEnumerable<ICssNode> Children => _children.AsEnumerable();
public CssNode()
{
_children = new List<ICssNode>();
_source = null;
}
public abstract void ToCss(TextWriter writer, IStyleFormatter formatter);
public void AppendChild(ICssNode child)
{
Setup(child);
_children.Add(child);
}
public void ReplaceChild(ICssNode oldChild, ICssNode newChild)
{
int num = 0;
while (true) {
if (num >= _children.Count)
return;
if (oldChild == _children[num])
break;
num++;
}
Teardown(oldChild);
Setup(newChild);
_children[num] = newChild;
}
public void InsertBefore(ICssNode referenceChild, ICssNode child)
{
if (referenceChild != null) {
int index = _children.IndexOf(referenceChild);
InsertChild(index, child);
} else
AppendChild(child);
}
public void InsertChild(int index, ICssNode child)
{
Setup(child);
_children.Insert(index, child);
}
public void RemoveChild(ICssNode child)
{
Teardown(child);
_children.Remove(child);
}
public void Clear()
{
for (int num = _children.Count - 1; num >= 0; num--) {
ICssNode child = _children[num];
RemoveChild(child);
}
}
protected void ReplaceAll(ICssNode node)
{
Clear();
_source = node.SourceCode;
foreach (ICssNode child in node.Children) {
AppendChild(child);
}
}
private void Setup(ICssNode child)
{
CssRule cssRule = child as CssRule;
if (cssRule != null) {
cssRule.Owner = (this as ICssStyleSheet);
cssRule.Parent = (this as ICssRule);
}
}
private void Teardown(ICssNode child)
{
CssRule cssRule = child as CssRule;
if (cssRule != null) {
cssRule.Parent = null;
cssRule.Owner = null;
}
}
}
}