89 lines
3 KiB
C#
89 lines
3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Gallium;
|
|
using HandlebarsDotNet;
|
|
using Nitride.Contents;
|
|
|
|
namespace Nitride.Handlebars
|
|
{
|
|
/// <summary>
|
|
/// An operation that applies a common or shared template on the content of
|
|
/// a document that includes theme or styling information.
|
|
/// </summary>
|
|
public class ApplyStyleHandlebarsTemplate<TModel> : NitrideOperationBase
|
|
{
|
|
private readonly HandlebarsTemplateCache cache;
|
|
|
|
public ApplyStyleHandlebarsTemplate(HandlebarsTemplateCache cache)
|
|
{
|
|
this.cache = cache;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public Func<Entity, TModel>? CreateModelCallback { get; set; }
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public Func<Entity, string>? GetTemplateName { get; set; }
|
|
|
|
public IHandlebars? Handlebars { get; set; }
|
|
|
|
/// <inheritdoc />
|
|
public override IEnumerable<Entity> Run(IEnumerable<Entity> input)
|
|
{
|
|
// Make sure we have sane data.
|
|
this.CheckNotNull(x => x.CreateModelCallback);
|
|
this.CheckNotNull(x => x.Handlebars);
|
|
this.CheckNotNull(x => x.GetTemplateName);
|
|
|
|
// Create and set up the Handlebars.
|
|
return input
|
|
.ForEachEntity<ITextContent>(this.Apply);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the callback for the template and returns the operation to
|
|
/// chain operations.
|
|
/// </summary>
|
|
/// <param name="callback">The callback to set.</param>
|
|
/// <returns>The ApplyContentHandlebarsTemplate to chain requests.</returns>
|
|
public ApplyStyleHandlebarsTemplate<TModel> WithCreateModelCallback(
|
|
Func<Entity, TModel>? callback)
|
|
{
|
|
this.CreateModelCallback = callback;
|
|
return this;
|
|
}
|
|
|
|
public ApplyStyleHandlebarsTemplate<TModel> WithGetTemplateName(
|
|
Func<Entity, string>? callback)
|
|
{
|
|
this.GetTemplateName = callback;
|
|
return this;
|
|
}
|
|
|
|
public ApplyStyleHandlebarsTemplate<TModel> WithHandlebars(
|
|
IHandlebars? handlebars)
|
|
{
|
|
this.Handlebars = handlebars;
|
|
return this;
|
|
}
|
|
|
|
private Entity Apply(Entity entity, ITextContent content)
|
|
{
|
|
TModel model = this.CreateModelCallback!(entity);
|
|
string name = this.GetTemplateName!(entity);
|
|
HandlebarsTemplate<object, object> template =
|
|
this.cache.GetNamedTemplate(name);
|
|
string result = template(model!);
|
|
|
|
return entity.SetTextContent(result);
|
|
}
|
|
}
|
|
}
|