ln.templates/ln.templates/Template.cs

84 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using Jint;
using Jint.Native;
using Jint.Native.Json;
using Jint.Native.Object;
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);
string metaFileName = Path.Combine(Path.GetDirectoryName(FileName), String.Format("{0}.json",Path.GetFileNameWithoutExtension(FileName)));
if (File.Exists(metaFileName))
{
using (StreamReader sr = new StreamReader(metaFileName))
_jsonMeta = sr.ReadToEnd();
}
else
{
_jsonMeta = "{}";
}
}
public ITemplateResolver Resolver { get; set; }
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) => Render(context, null);
public void Render(Context context, ObjectInstance globals)
{
DateTime currentLastWriteTime = File.GetLastWriteTime(FileName);
if (currentLastWriteTime > LastWriteTime)
Load();
if (_jsonMeta is not null)
context.AssignGlobals(new JsonParser(context.Engine).Parse(_jsonMeta) as ObjectInstance);
if (globals is not null)
context.AssignGlobals(globals);
Document.RenderTemplate(context);
context.TargetWriter.Flush();
}
/* JSON Metadata */
private string _jsonMeta;
public JsValue GetMetaObject(Engine engine) => new JsonParser(engine).Parse(_jsonMeta);
}