mirror of https://github.com/abpframework/abp.git
32 changed files with 339 additions and 84 deletions
@ -0,0 +1,33 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Volo.Abp.TextTemplating |
||||
|
{ |
||||
|
public class AbpTemplateRendererProviderOptions |
||||
|
{ |
||||
|
protected IDictionary<string, Type> Providers { get; } |
||||
|
|
||||
|
public AbpTemplateRendererProviderOptions() |
||||
|
{ |
||||
|
Providers = new Dictionary<string, Type>(); |
||||
|
} |
||||
|
|
||||
|
public AbpTemplateRendererProviderOptions AddProvider<TProvider>(string templateRenderEngineName) |
||||
|
where TProvider : ITemplateRendererProvider |
||||
|
{ |
||||
|
if (Providers.ContainsKey(templateRenderEngineName)) |
||||
|
{ |
||||
|
Providers.RemoveAll(x => x.Key == templateRenderEngineName); |
||||
|
} |
||||
|
|
||||
|
Providers[templateRenderEngineName] = typeof(TProvider); |
||||
|
|
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public Type GetProviderTypeOrNull(string templateRenderEngineName) |
||||
|
{ |
||||
|
return templateRenderEngineName == null ? null : Providers.GetOrDefault(templateRenderEngineName); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Globalization; |
||||
|
using System.Threading.Tasks; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.TextTemplating |
||||
|
{ |
||||
|
public interface ITemplateRendererProvider |
||||
|
{ |
||||
|
string Name { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Renders a text template.
|
||||
|
/// </summary>
|
||||
|
/// <param name="templateName">The template name</param>
|
||||
|
/// <param name="model">An optional model object that is used in the template</param>
|
||||
|
/// <param name="cultureName">Culture name. Uses the <see cref="CultureInfo.CurrentUICulture"/> if not specified</param>
|
||||
|
/// <param name="globalContext">A dictionary which can be used to import global objects to the template</param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<string> RenderAsync( |
||||
|
[NotNull] string templateName, |
||||
|
[CanBeNull] object model = null, |
||||
|
[CanBeNull] string cultureName = null, |
||||
|
[CanBeNull] Dictionary<string, object> globalContext = null |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Localization; |
||||
|
|
||||
|
namespace Volo.Abp.TextTemplating |
||||
|
{ |
||||
|
public abstract class TemplateRendererProviderBase : ITemplateRendererProvider |
||||
|
{ |
||||
|
public abstract string Name { get; } |
||||
|
|
||||
|
protected readonly ITemplateDefinitionManager TemplateDefinitionManager; |
||||
|
protected readonly ITemplateContentProvider TemplateContentProvider; |
||||
|
protected readonly IStringLocalizerFactory StringLocalizerFactory; |
||||
|
|
||||
|
public TemplateRendererProviderBase( |
||||
|
ITemplateDefinitionManager templateDefinitionManager, |
||||
|
ITemplateContentProvider templateContentProvider, |
||||
|
IStringLocalizerFactory stringLocalizerFactory) |
||||
|
{ |
||||
|
TemplateDefinitionManager = templateDefinitionManager; |
||||
|
TemplateContentProvider = templateContentProvider; |
||||
|
StringLocalizerFactory = stringLocalizerFactory; |
||||
|
} |
||||
|
|
||||
|
public abstract Task<string> RenderAsync(string templateName, object model = null, string cultureName = null, Dictionary<string, object> globalContext = null); |
||||
|
|
||||
|
protected virtual async Task<string> GetContentOrNullAsync(TemplateDefinition templateDefinition) |
||||
|
{ |
||||
|
return await TemplateContentProvider.GetContentOrNullAsync(templateDefinition); |
||||
|
} |
||||
|
|
||||
|
protected virtual IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition) |
||||
|
{ |
||||
|
if (templateDefinition.LocalizationResource != null) |
||||
|
{ |
||||
|
return StringLocalizerFactory.Create(templateDefinition.LocalizationResource); |
||||
|
} |
||||
|
|
||||
|
return StringLocalizerFactory.CreateDefaultOrNull(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,53 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.TextTemplating.Scriban; |
||||
|
|
||||
|
namespace Volo.Abp.TextTemplating |
||||
|
{ |
||||
|
public class AbpTemplateRenderer : ITemplateRenderer, ITransientDependency |
||||
|
{ |
||||
|
protected IServiceProvider ServiceProvider { get; } |
||||
|
protected ITemplateDefinitionManager TemplateDefinitionManager { get; } |
||||
|
protected AbpTemplateRendererProviderOptions Options { get; } |
||||
|
|
||||
|
public AbpTemplateRenderer( |
||||
|
IServiceProvider serviceProvider, |
||||
|
ITemplateDefinitionManager templateDefinitionManager, |
||||
|
IOptions<AbpTemplateRendererProviderOptions> options) |
||||
|
{ |
||||
|
ServiceProvider = serviceProvider; |
||||
|
TemplateDefinitionManager = templateDefinitionManager; |
||||
|
Options = options.Value; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<string> RenderAsync( |
||||
|
string templateName, |
||||
|
object model = null, |
||||
|
string cultureName = null, |
||||
|
Dictionary<string, object> globalContext = null) |
||||
|
{ |
||||
|
var templateDefinition = TemplateDefinitionManager.Get(templateName); |
||||
|
|
||||
|
var renderEngine = templateDefinition.RenderEngine; |
||||
|
|
||||
|
if (renderEngine.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
renderEngine = ScribanTemplateRendererProvider.ProviderName; |
||||
|
} |
||||
|
|
||||
|
var providerType = Options.GetProviderTypeOrNull(renderEngine); |
||||
|
|
||||
|
if (providerType != null) |
||||
|
{ |
||||
|
var templateRendererProvider = (ITemplateRendererProvider)ServiceProvider.GetRequiredService(providerType); |
||||
|
return await templateRendererProvider.RenderAsync(templateName, model, cultureName, globalContext); |
||||
|
} |
||||
|
|
||||
|
throw new AbpException("There is no render engine found with template name: " + templateName); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,10 +1,13 @@ |
|||||
using Volo.Abp.Modularity; |
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.TextTemplating.Razor; |
||||
using Volo.Abp.TextTemplating.Scriban; |
using Volo.Abp.TextTemplating.Scriban; |
||||
|
|
||||
namespace Volo.Abp.TextTemplating |
namespace Volo.Abp.TextTemplating |
||||
{ |
{ |
||||
[DependsOn( |
[DependsOn( |
||||
typeof(AbpTextTemplatingScribanModule) |
typeof(AbpTextTemplatingAbstractionsModule), |
||||
|
typeof(AbpTextTemplatingScribanModule), |
||||
|
typeof(AbpTextTemplatingRazorModule) |
||||
)] |
)] |
||||
public class AbpTextTemplatingModule : AbpModule |
public class AbpTextTemplatingModule : AbpModule |
||||
{ |
{ |
||||
@ -1,2 +1,2 @@ |
|||||
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ForgotPasswordEmailModel> |
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ForgotPasswordEmailModel> |
||||
@Localizer["HelloText", Model.Name], @Localizer["HowAreYou"]. Please click to the following link to get an email to reset your password! |
@Localizer["HelloText", Model.Name], @Localizer["HowAreYou"]. Please click to the following link to get an email to reset your password! |
||||
@ -1,2 +1,2 @@ |
|||||
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ShowDecimalNumberModel> |
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ShowDecimalNumberModel> |
||||
@Model.Amount |
@Model.Amount |
||||
@ -1,2 +1,2 @@ |
|||||
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel> |
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel> |
||||
Welcome @Model.Name to the abp.io! |
Welcome @Model.Name to the abp.io! |
||||
@ -1,2 +1,2 @@ |
|||||
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel> |
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel> |
||||
Merhaba @Model.Name, abp.io'ya hoşgeldiniz! |
Merhaba @Model.Name, abp.io'ya hoşgeldiniz! |
||||
@ -0,0 +1,46 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Shouldly; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.TextTemplating |
||||
|
{ |
||||
|
public class HybridTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<AbpTextTemplatingTestModule> |
||||
|
{ |
||||
|
private readonly ITemplateRenderer _templateRenderer; |
||||
|
|
||||
|
public HybridTemplateRendererProvider_Tests() |
||||
|
{ |
||||
|
_templateRenderer = GetRequiredService<ITemplateRenderer>(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Render_By_Scriban() |
||||
|
{ |
||||
|
(await _templateRenderer.RenderAsync( |
||||
|
TestTemplates.HybridTemplateScriban, |
||||
|
model: new |
||||
|
{ |
||||
|
name = "John" |
||||
|
} |
||||
|
)).ShouldBe("Hello John, how are you?"); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Render_By_Razor() |
||||
|
{ |
||||
|
(await _templateRenderer.RenderAsync( |
||||
|
TestTemplates.HybridTemplateRazor, |
||||
|
model: new HybridModel |
||||
|
{ |
||||
|
Name = "John" |
||||
|
} |
||||
|
)).ShouldBe("Hello John, how are you?"); |
||||
|
} |
||||
|
|
||||
|
public class HybridModel |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,2 @@ |
|||||
|
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.HybridTemplateRendererProvider_Tests.HybridModel> |
||||
|
Hello @Model.Name, @Localizer["HowAreYou"] |
||||
@ -0,0 +1 @@ |
|||||
|
Hello {{model.name}}, {{L "HowAreYou" }} |
||||
Loading…
Reference in new issue