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 children { get; } = new List(); 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); } } }