84 lines
2.4 KiB
C#
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);
|
|
|
|
} |