ln.templates/Template.cs

108 lines
3.3 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using ln.templates.streams;
using ln.templates.elements;
namespace ln.templates
{
public class Template
{
public TemplateProvider Provider { get; private set; }
public String SourceFilename { get; private set; }
public Element RootElement { get; private set; }
public Expression FrameExpression { get; private set; }
public Template(String sourceFilename)
{
SourceFilename = sourceFilename;
LoadSource(null);
}
public Template(String sourceFilename, TemplateProvider provider)
{
Provider = provider;
SourceFilename = sourceFilename;
LoadSource(null);
}
public Template(String source,String pseudoFilename,TemplateProvider provider)
{
Provider = provider;
SourceFilename = pseudoFilename;
LoadSource(source);
}
private void LoadSource(String source)
{
if (source == null)
{
using (FileStream fileStream = new FileStream(SourceFilename, FileMode.Open))
{
byte[] loadBuffer = new byte[fileStream.Length];
fileStream.Read(loadBuffer, 0, loadBuffer.Length);
fileStream.Close();
source = Encoding.UTF8.GetString(loadBuffer);
}
}
TemplateReader templateReader = new TemplateReader(source);
RootElement = templateReader.RootElement;
FrameExpression = templateReader.FrameExpression;
}
public String Generate()
{
Context context = new Context(this);
return Generate(context);
}
public String Generate(Context context)
{
StringWriter writer = new StringWriter();
RootElement.Generate(writer, context);
if (FrameExpression != null)
{
Template frame = context.Provider.FindTemplate(FrameExpression.Evaluate(null) as string);
return frame.Generate(new Context(context, writer.ToString()));
}
return writer.ToString();
}
public class Context
{
public Context Parent { get; }
public Template Template { get; }
public TemplateProvider Provider => Template.Provider;
public String FramedContent { get; }
public Expression.Context ExpressionContext { get; }
public Context(Template template)
{
Template = template;
ExpressionContext = new Expression.Context(null, null);
ExpressionContext.AddMappedValue("__template__", template.SourceFilename);
}
public Context(Context parent,String framedContent)
{
Parent = parent;
Template = parent.Template;
FramedContent = framedContent;
ExpressionContext = new Expression.Context(parent.ExpressionContext);
if (framedContent != null)
ExpressionContext.SetMappedValue("__frame__", framedContent);
}
}
}
}