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>()); public void Render(TextWriter target, IEnumerable> 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); }