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.TextTemplating.Razor; |
|||
using Volo.Abp.TextTemplating.Scriban; |
|||
|
|||
namespace Volo.Abp.TextTemplating |
|||
{ |
|||
[DependsOn( |
|||
typeof(AbpTextTemplatingScribanModule) |
|||
typeof(AbpTextTemplatingAbstractionsModule), |
|||
typeof(AbpTextTemplatingScribanModule), |
|||
typeof(AbpTextTemplatingRazorModule) |
|||
)] |
|||
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! |
|||
@ -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 |
|||
@ -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! |
|||
@ -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! |
|||
@ -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