56 lines
1.4 KiB
C#
56 lines
1.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using ln.templates.html;
|
|
|
|
namespace ln.templates;
|
|
|
|
public class Template
|
|
{
|
|
public Template(string filename, ITemplateResolver resolver)
|
|
:this(filename, resolver, null)
|
|
{}
|
|
|
|
private Template(string filename, ITemplateResolver resolver, string source)
|
|
{
|
|
FileName = filename;
|
|
Resolver = resolver;
|
|
|
|
if (source is null)
|
|
{
|
|
Load();
|
|
}
|
|
else
|
|
{
|
|
Document = TemplateReader.Parse(source);
|
|
}
|
|
}
|
|
|
|
private void Load()
|
|
{
|
|
Document = TemplateReader.ReadTemplate(FileName);
|
|
LastWriteTime = File.GetLastWriteTime(FileName);
|
|
}
|
|
|
|
|
|
public ITemplateResolver Resolver { get; }
|
|
public string FileName { get; }
|
|
public TemplateDocument Document { get; private set; }
|
|
public DateTime LastWriteTime { get; private set; }
|
|
|
|
public void Render(TextWriter target) => Render(target, Array.Empty<KeyValuePair<string, object>>());
|
|
public void Render(TextWriter target, IEnumerable<KeyValuePair<string, object>> scriptObjects)
|
|
{
|
|
Context context = new Context(Resolver, scriptObjects, target);
|
|
Render(context);
|
|
}
|
|
|
|
public void Render(Context context)
|
|
{
|
|
DateTime currentLastWriteTime = File.GetLastWriteTime(FileName);
|
|
if (currentLastWriteTime > LastWriteTime)
|
|
Load();
|
|
|
|
Document.RenderTemplate(context);
|
|
}
|
|
} |