ln.templates/ln.templates/elements/Element.cs

98 lines
2.6 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
namespace ln.templates.elements
{
public abstract class Element
{
public ContainerElement Container { get; internal set; }
protected Element(ContainerElement container)
{
Container = container;
if (Container != null)
Container.children.Add(this);
}
public abstract void Generate(TextWriter writer, Template.Context context);
}
public class ContainerElement : Element
{
internal List<Element> children { get; } = new List<Element>();
public ContainerElement(ContainerElement container)
:base(container)
{
}
public void GenerateChildren(TextWriter writer, Template.Context context)
{
foreach (Element c in children)
c.Generate(writer, context);
}
public override void Generate(TextWriter writer, Template.Context context)
{
GenerateChildren(writer, context);
}
public Element[] Children
{
get => children.ToArray();
}
}
public class TextElement : Element
{
public String Text { get; }
public TextElement(ContainerElement container,String text)
:base(container)
{
Text = text;
}
public override void Generate(TextWriter writer, Template.Context context)
{
writer.Write(Text);
}
}
public class ExpressionElement : Element
{
public Expression Expression { get; }
public ExpressionElement(ContainerElement container,Expression expression)
:base(container)
{
Expression = expression;
}
public override void Generate(TextWriter writer, Template.Context context)
{
object v = Expression.Evaluate(context.ExpressionContext);
if (v != null)
writer.Write(v.ToString());
}
}
public class SetElement : Element
{
public String SetName { get; }
public Expression Expression { get; }
public SetElement(ContainerElement container, String setName,Expression expression)
: base(container)
{
SetName = setName;
Expression = expression;
}
public override void Generate(TextWriter writer, Template.Context context)
{
object v = Expression.Evaluate(context.ExpressionContext);
context.ExpressionContext.SetMappedValue(SetName, v);
}
}
}