using System; using System.Collections.Generic; using FluentValidation; using MfGames.Gallium; using HandlebarsDotNet; using MfGames.Nitride.Contents; namespace MfGames.Nitride.Handlebars; /// /// An operation that applies a common or shared template on the content of /// a document that includes theme or styling information. /// [WithProperties] public partial class ApplyStyleTemplate : OperationBase { private readonly HandlebarsTemplateCache cache; private readonly IValidator validator; public ApplyStyleTemplate( IValidator validator, HandlebarsTemplateCache cache) { this.validator = validator; this.cache = cache; } /// /// Gets or sets the callback used to create a model from a given /// entity. This allows for the website to customize what information is /// being passed to the template. /// public Func? CreateModelCallback { get; set; } /// /// Gets or sets the callback used to determine which template to use /// for a given entity. This lets one have a per-page template change. /// public Func? GetTemplateName { get; set; } public IHandlebars? Handlebars { get; set; } /// public override IEnumerable Run(IEnumerable input) { // Make sure we have sane data. this.validator.ValidateAndThrow(this); // Create and set up the Handlebars. return input.SelectEntity(this.Apply); } private Entity Apply( Entity entity, ITextContent content) { object model = this.CreateModelCallback!(entity); string name = this.GetTemplateName!(entity); HandlebarsTemplate template = this.cache.GetNamedTemplate(name); string result = template(model!); return entity.SetTextContent(result); } }