55 lines
2.3 KiB
C#
55 lines
2.3 KiB
C#
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json.Linq;
|
|
using RazorLight;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
|
|
//https://github.com/mailgun/transactional-email-templates
|
|
//https://docs.microsoft.com/en-us/aspnet/core/mvc/views/layout
|
|
//https://github.com/toddams/RazorLight
|
|
|
|
namespace Knoks.Framework.Content
|
|
{
|
|
public class ContentGenerator : IContentGenerator
|
|
{
|
|
private readonly ILogger<IContentGenerator> _logger;
|
|
private readonly IRazorLightEngine _engine;
|
|
|
|
public ContentGenerator(ILogger<IContentGenerator> logger)
|
|
{
|
|
_logger = logger;
|
|
//_engine = EngineFactory.CreatePhysical(Path.Combine(Directory.GetCurrentDirectory(), "Templates"));
|
|
//_engine = new EngineFactory().ForFileSystem(Path.Combine(Directory.GetCurrentDirectory(), "Templates"));
|
|
_engine = new RazorLightEngineBuilder()
|
|
.UseFilesystemProject(Path.Combine(Directory.GetCurrentDirectory(), "Templates"))
|
|
.UseMemoryCachingProvider()
|
|
.Build();
|
|
}
|
|
|
|
public ContentResult GenerateContent(ContentSettings contentSettings)
|
|
{
|
|
dynamic dataModel = contentSettings.Data;
|
|
|
|
var contentJson = _engine.CompileRenderAsync(Path.Combine(contentSettings.Category, $"{contentSettings.Group}{contentSettings.ContentGroup}.{ContentSettings.DefaultLanguageCode}.json"), dataModel as object).Result;
|
|
|
|
JObject defaultContent, localizedContent;
|
|
defaultContent = localizedContent = JObject.Parse(contentJson);
|
|
|
|
if (contentSettings.LanguageCode != ContentSettings.DefaultLanguageCode)
|
|
{
|
|
contentJson = _engine.CompileRenderAsync(Path.Combine(contentSettings.Category, $"{contentSettings.Group}{contentSettings.ContentGroup}.{contentSettings.LanguageCode}.json"), dataModel as object).Result;
|
|
localizedContent = JObject.Parse(contentJson);
|
|
}
|
|
|
|
var model = new ContentModel(contentSettings, defaultContent, localizedContent);
|
|
var content = _engine.CompileRenderAsync(Path.Combine(contentSettings.Category, $"{contentSettings.Group}.cshtml"), model).Result;
|
|
|
|
//TODO: HtmlDecode fix
|
|
content = WebUtility.HtmlDecode(content);
|
|
|
|
return new ContentResult(model, content);
|
|
}
|
|
}
|
|
}
|