diff --git a/docs/en/Text-Templating-Razor.md b/docs/en/Text-Templating-Razor.md index 700d262b9b..770de46ca6 100644 --- a/docs/en/Text-Templating-Razor.md +++ b/docs/en/Text-Templating-Razor.md @@ -84,6 +84,7 @@ public class DemoTemplateDefinitionProvider : TemplateDefinitionProvider { context.Add( new TemplateDefinition("Hello") //template name: "Hello" + .WithRazorTemplate() .WithVirtualFilePath( "/Demos/Hello/Hello.cshtml", //template content path isInlineLocalized: true @@ -97,6 +98,7 @@ public class DemoTemplateDefinitionProvider : TemplateDefinitionProvider * `TemplateDefinition` is the class represents a template. Each template must have a unique name (that will be used while you are rendering the template). * `/Demos/Hello/Hello.cshtml` is the path of the template file. * `isInlineLocalized` is used to declare if you are using a single template for all languages (`true`) or different templates for each language (`false`). See the Localization section below for more. +* `WithRenderEngine` method is used to set the render engine of the template. ### The Template Base @@ -223,7 +225,9 @@ context.Add( new TemplateDefinition( "PasswordReset", //Template name typeof(DemoResource) //LOCALIZATION RESOURCE - ).WithVirtualFilePath( + ) + .WithRazorTemplate() + .WithVirtualFilePath( "/Demos/PasswordReset/PasswordReset.cshtml", //template content path isInlineLocalized: true ) @@ -271,6 +275,7 @@ context.Add( name: "WelcomeEmail", defaultCultureName: "en" ) + .WithRazorTemplate() .WithVirtualFilePath( "/Demos/WelcomeEmail/Templates", //template content folder isInlineLocalized: false @@ -333,7 +338,9 @@ context.Add( new TemplateDefinition( "EmailLayout", isLayout: true //SET isLayout! - ).WithVirtualFilePath( + ) + .WithRazorTemplate() + .WithVirtualFilePath( "/Demos/EmailLayout/EmailLayout.cshtml", isInlineLocalized: true ) @@ -348,7 +355,9 @@ context.Add( name: "WelcomeEmail", defaultCultureName: "en", layout: "EmailLayout" //Set the LAYOUT - ).WithVirtualFilePath( + ) + .WithRazorTemplate() + .WithVirtualFilePath( "/Demos/WelcomeEmail/Templates", isInlineLocalized: false ) diff --git a/docs/en/Text-Templating-Scriban.md b/docs/en/Text-Templating-Scriban.md index 4d9be31dc8..4263be011e 100644 --- a/docs/en/Text-Templating-Scriban.md +++ b/docs/en/Text-Templating-Scriban.md @@ -49,6 +49,7 @@ public class DemoTemplateDefinitionProvider : TemplateDefinitionProvider "/Demos/Hello/Hello.tpl", //template content path isInlineLocalized: true ) + .WithScribanTemplate() ); } } @@ -58,6 +59,7 @@ public class DemoTemplateDefinitionProvider : TemplateDefinitionProvider * `TemplateDefinition` is the class represents a template. Each template must have a unique name (that will be used while you are rendering the template). * `/Demos/Hello/Hello.tpl` is the path of the template file. * `isInlineLocalized` is used to declare if you are using a single template for all languages (`true`) or different templates for each language (`false`). See the Localization section below for more. +* `WithRenderEngine` method is used to set the render engine of the template. ### The Template Content @@ -175,7 +177,9 @@ context.Add( new TemplateDefinition( "PasswordReset", //Template name typeof(DemoResource) //LOCALIZATION RESOURCE - ).WithVirtualFilePath( + ) + .WithScribanTemplate() + .WithVirtualFilePath( "/Demos/PasswordReset/PasswordReset.tpl", //template content path isInlineLocalized: true ) @@ -223,6 +227,7 @@ context.Add( name: "WelcomeEmail", defaultCultureName: "en" ) + .WithScribanTemplate() .WithVirtualFilePath( "/Demos/WelcomeEmail/Templates", //template content folder isInlineLocalized: false @@ -284,7 +289,9 @@ context.Add( new TemplateDefinition( "EmailLayout", isLayout: true //SET isLayout! - ).WithVirtualFilePath( + ) + .WithScribanTemplate() + .WithVirtualFilePath( "/Demos/EmailLayout/EmailLayout.tpl", isInlineLocalized: true ) @@ -299,7 +306,9 @@ context.Add( name: "WelcomeEmail", defaultCultureName: "en", layout: "EmailLayout" //Set the LAYOUT - ).WithVirtualFilePath( + ) + .WithScribanTemplate() + .WithVirtualFilePath( "/Demos/WelcomeEmail/Templates", isInlineLocalized: false ) diff --git a/docs/en/Text-Templating.md b/docs/en/Text-Templating.md index c9b03cd940..b5d082f627 100644 --- a/docs/en/Text-Templating.md +++ b/docs/en/Text-Templating.md @@ -24,6 +24,8 @@ ABP Framework provides two types of engines; * **[Razor](Text-Templating-Razor.md)** * **[Scriban](Text-Templating-Scriban.md)** +You can use different template engines in the same application, or even create a new custom template engine. + ## Source Code Get [the source code of the sample application](https://github.com/abpframework/abp-samples/tree/master/TextTemplateDemo) developed and referred through this document. diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index d7d7cdd4d1..160918667d 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -385,7 +385,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.UI. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Authorization.Abstractions", "src\Volo.Abp.Authorization.Abstractions\Volo.Abp.Authorization.Abstractions.csproj", "{87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Abstractions", "src\Volo.Abp.TextTemplating.Abstractions\Volo.Abp.TextTemplating.Abstractions.csproj", "{184E859A-282D-44D7-B8E9-FEA874644013}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Core", "src\Volo.Abp.TextTemplating.Core\Volo.Abp.TextTemplating.Core.csproj", "{184E859A-282D-44D7-B8E9-FEA874644013}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Scriban", "src\Volo.Abp.TextTemplating.Scriban\Volo.Abp.TextTemplating.Scriban.csproj", "{228723E6-FA6D-406B-B8F8-C9BCC547AF8E}" EndProject diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xml b/framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xml similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xml rename to framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xml diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xsd b/framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xsd similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xsd rename to framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo.Abp.TextTemplating.Abstractions.csproj b/framework/src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.csproj similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo.Abp.TextTemplating.Abstractions.csproj rename to framework/src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.csproj diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTemplateRenderer.cs new file mode 100644 index 0000000000..4157910320 --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTemplateRenderer.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.TextTemplating +{ + public class AbpTemplateRenderer : ITemplateRenderer, ITransientDependency + { + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected ITemplateDefinitionManager TemplateDefinitionManager { get; } + protected AbpTextTemplatingOptions Options { get; } + + public AbpTemplateRenderer( + IServiceScopeFactory serviceScopeFactory, + ITemplateDefinitionManager templateDefinitionManager, + IOptions options) + { + ServiceScopeFactory = serviceScopeFactory; + TemplateDefinitionManager = templateDefinitionManager; + Options = options.Value; + } + + public virtual async Task RenderAsync( + string templateName, + object model = null, + string cultureName = null, + Dictionary globalContext = null) + { + var templateDefinition = TemplateDefinitionManager.Get(templateName); + + var renderEngine = templateDefinition.RenderEngine; + + if (renderEngine.IsNullOrWhiteSpace()) + { + renderEngine = Options.DefaultRenderingEngine; + } + + var providerType = Options.RenderingEngines.GetOrDefault(renderEngine); + + if (providerType != null && typeof(ITemplateRenderingEngine).IsAssignableFrom(providerType)) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var templateRenderingEngine = (ITemplateRenderingEngine)scope.ServiceProvider.GetRequiredService(providerType); + return await templateRenderingEngine.RenderAsync(templateName, model, cultureName, globalContext); + } + } + + throw new AbpException("There is no rendering engine found with template name: " + templateName); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingAbstractionsModule.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingCoreModule.cs similarity index 95% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingAbstractionsModule.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingCoreModule.cs index bb76b299b2..8a908c2ffd 100644 --- a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingAbstractionsModule.cs +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingCoreModule.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.TextTemplating typeof(AbpVirtualFileSystemModule), typeof(AbpLocalizationAbstractionsModule) )] - public class AbpTextTemplatingAbstractionsModule : AbpModule + public class AbpTextTemplatingCoreModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs similarity index 63% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs index b217094974..b3e4561fb1 100644 --- a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs @@ -1,4 +1,6 @@ -using Volo.Abp.Collections; +using System; +using System.Collections.Generic; +using Volo.Abp.Collections; namespace Volo.Abp.TextTemplating { @@ -6,11 +8,15 @@ namespace Volo.Abp.TextTemplating { public ITypeList DefinitionProviders { get; } public ITypeList ContentContributors { get; } + public IDictionary RenderingEngines { get; } + + public string DefaultRenderingEngine { get; set; } public AbpTextTemplatingOptions() { DefinitionProviders = new TypeList(); ContentContributors = new TypeList(); + RenderingEngines = new Dictionary(); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentContributor.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentContributor.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentContributor.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentContributor.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentProvider.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentProvider.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentProvider.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentProvider.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderer.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRenderer.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderer.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderingEngine.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderingEngine.cs new file mode 100644 index 0000000000..f55dd03a1b --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderingEngine.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Volo.Abp.TextTemplating +{ + public interface ITemplateRenderingEngine + { + string Name { get; } + + /// + /// Renders a text template. + /// + /// The template name + /// An optional model object that is used in the template + /// Culture name. Uses the if not specified + /// A dictionary which can be used to import global objects to the template + /// + Task RenderAsync( + [NotNull] string templateName, + [CanBeNull] object model = null, + [CanBeNull] string cultureName = null, + [CanBeNull] Dictionary globalContext = null + ); + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentProvider.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentProvider.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentProvider.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentProvider.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs similarity index 88% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs index 948c1712db..984bd8885b 100644 --- a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs @@ -37,6 +37,9 @@ namespace Volo.Abp.TextTemplating [CanBeNull] public string DefaultCultureName { get; } + [CanBeNull] + public string RenderEngine { get; set; } + /// /// Gets/sets a key-value on the . /// @@ -84,5 +87,14 @@ namespace Volo.Abp.TextTemplating Properties[key] = value; return this; } + + /// + /// Sets the Render Engine of . + /// + public virtual TemplateDefinition WithRenderEngine(string renderEngine) + { + RenderEngine = renderEngine; + return this; + } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateRenderingEngineBase.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateRenderingEngineBase.cs new file mode 100644 index 0000000000..4606e434ad --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateRenderingEngineBase.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.Localization; + +namespace Volo.Abp.TextTemplating +{ + public abstract class TemplateRenderingEngineBase : ITemplateRenderingEngine + { + public abstract string Name { get; } + + protected readonly ITemplateDefinitionManager TemplateDefinitionManager; + protected readonly ITemplateContentProvider TemplateContentProvider; + protected readonly IStringLocalizerFactory StringLocalizerFactory; + + public TemplateRenderingEngineBase( + ITemplateDefinitionManager templateDefinitionManager, + ITemplateContentProvider templateContentProvider, + IStringLocalizerFactory stringLocalizerFactory) + { + TemplateDefinitionManager = templateDefinitionManager; + TemplateContentProvider = templateContentProvider; + StringLocalizerFactory = stringLocalizerFactory; + } + + public abstract Task RenderAsync(string templateName, object model = null, string cultureName = null, Dictionary globalContext = null); + + protected virtual async Task 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(); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs similarity index 100% rename from framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs rename to framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj b/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj index f4d16e630c..3425fb624a 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj +++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj @@ -9,7 +9,7 @@ - + diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs index 318a356b93..446ba00cc1 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs +++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs @@ -1,12 +1,23 @@ -using Volo.Abp.Modularity; +using System; +using Volo.Abp.Modularity; namespace Volo.Abp.TextTemplating.Razor { [DependsOn( - typeof(AbpTextTemplatingAbstractionsModule) + typeof(AbpTextTemplatingCoreModule) )] public class AbpTextTemplatingRazorModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + if (options.DefaultRenderingEngine.IsNullOrWhiteSpace()) + { + options.DefaultRenderingEngine = RazorTemplateRenderingEngine.EngineName; + } + options.RenderingEngines[RazorTemplateRenderingEngine.EngineName] = typeof(RazorTemplateRenderingEngine); + }); + } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateDefinitionExtensions.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateDefinitionExtensions.cs new file mode 100644 index 0000000000..1904e3004d --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateDefinitionExtensions.cs @@ -0,0 +1,12 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.TextTemplating.Razor +{ + public static class RazorTemplateDefinitionExtensions + { + public static TemplateDefinition WithRazorTemplate([NotNull] this TemplateDefinition templateDefinition) + { + return templateDefinition.WithRenderEngine(RazorTemplateRenderingEngine.EngineName); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs similarity index 77% rename from framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs rename to framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs index db06e67d4a..3ef2d69fd6 100644 --- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs +++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs @@ -12,27 +12,27 @@ using Volo.Abp.Localization; namespace Volo.Abp.TextTemplating.Razor { - [Dependency(ReplaceServices = true)] - public class RazorTemplateRenderer : ITemplateRenderer, ITransientDependency + public class RazorTemplateRenderingEngine : TemplateRenderingEngineBase, ITransientDependency { - private readonly IServiceScopeFactory _serviceScopeFactory; - private readonly IAbpCompiledViewProvider _abpCompiledViewProvider; - private readonly ITemplateDefinitionManager _templateDefinitionManager; - private readonly IStringLocalizerFactory _stringLocalizerFactory; + public const string EngineName = "Razor"; + public override string Name => EngineName; - public RazorTemplateRenderer( + protected readonly IServiceScopeFactory ServiceScopeFactory; + protected readonly IAbpCompiledViewProvider AbpCompiledViewProvider; + + public RazorTemplateRenderingEngine( IServiceScopeFactory serviceScopeFactory, IAbpCompiledViewProvider abpCompiledViewProvider, ITemplateDefinitionManager templateDefinitionManager, + ITemplateContentProvider templateContentProvider, IStringLocalizerFactory stringLocalizerFactory) + : base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory) { - _serviceScopeFactory = serviceScopeFactory; - _templateDefinitionManager = templateDefinitionManager; - _stringLocalizerFactory = stringLocalizerFactory; - _abpCompiledViewProvider = abpCompiledViewProvider; + ServiceScopeFactory = serviceScopeFactory; + AbpCompiledViewProvider = abpCompiledViewProvider; } - public virtual async Task RenderAsync( + public override async Task RenderAsync( [NotNull] string templateName, [CanBeNull] object model = null, [CanBeNull] string cultureName = null, @@ -74,7 +74,7 @@ namespace Volo.Abp.TextTemplating.Razor Dictionary globalContext, object model = null) { - var templateDefinition = _templateDefinitionManager.Get(templateName); + var templateDefinition = TemplateDefinitionManager.Get(templateName); var renderedContent = await RenderSingleTemplateAsync( templateDefinition, @@ -115,11 +115,11 @@ namespace Volo.Abp.TextTemplating.Razor Dictionary globalContext, object model = null) { - var assembly = await _abpCompiledViewProvider.GetAssemblyAsync(templateDefinition); + var assembly = await AbpCompiledViewProvider.GetAssemblyAsync(templateDefinition); var templateType = assembly.GetType(AbpRazorTemplateConsts.TypeName); var template = (IRazorTemplatePage) Activator.CreateInstance(templateType); - using (var scope = _serviceScopeFactory.CreateScope()) + using (var scope = ServiceScopeFactory.CreateScope()) { var modelType = templateType .GetInterfaces() @@ -154,15 +154,5 @@ namespace Volo.Abp.TextTemplating.Razor razorTemplatePageWithModel.Model = (TModel)model; } } - - private IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition) - { - if (templateDefinition.LocalizationResource != null) - { - return _stringLocalizerFactory.Create(templateDefinition.LocalizationResource); - } - - return _stringLocalizerFactory.CreateDefaultOrNull(); - } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj index b4b0d66789..4581050b6a 100644 --- a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj +++ b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj @@ -9,7 +9,7 @@ - + diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs index 789b9e376f..fb05325a95 100644 --- a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs +++ b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs @@ -3,10 +3,17 @@ namespace Volo.Abp.TextTemplating.Scriban { [DependsOn( - typeof(AbpTextTemplatingAbstractionsModule) + typeof(AbpTextTemplatingCoreModule) )] public class AbpTextTemplatingScribanModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.DefaultRenderingEngine = ScribanTemplateRenderingEngine.EngineName; + options.RenderingEngines[ScribanTemplateRenderingEngine.EngineName] = typeof(ScribanTemplateRenderingEngine); + }); + } } } diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateDefinitionExtensions.cs b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateDefinitionExtensions.cs new file mode 100644 index 0000000000..4575539c4f --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateDefinitionExtensions.cs @@ -0,0 +1,12 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.TextTemplating.Scriban +{ + public static class ScribanTemplateDefinitionExtensions + { + public static TemplateDefinition WithScribanTemplate([NotNull] this TemplateDefinition templateDefinition) + { + return templateDefinition.WithRenderEngine(ScribanTemplateRenderingEngine.EngineName); + } + } +} diff --git a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderingEngine.cs similarity index 77% rename from framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs rename to framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderingEngine.cs index 3fdd667a82..81038e2d0f 100644 --- a/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs +++ b/framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderingEngine.cs @@ -9,23 +9,20 @@ using Volo.Abp.Localization; namespace Volo.Abp.TextTemplating.Scriban { - public class ScribanTemplateRenderer : ITemplateRenderer, ITransientDependency + public class ScribanTemplateRenderingEngine : TemplateRenderingEngineBase, ITransientDependency { - private readonly ITemplateContentProvider _templateContentProvider; - private readonly ITemplateDefinitionManager _templateDefinitionManager; - private readonly IStringLocalizerFactory _stringLocalizerFactory; + public const string EngineName = "Scriban"; + public override string Name => EngineName; - public ScribanTemplateRenderer( - ITemplateContentProvider templateContentProvider, + public ScribanTemplateRenderingEngine( ITemplateDefinitionManager templateDefinitionManager, + ITemplateContentProvider templateContentProvider, IStringLocalizerFactory stringLocalizerFactory) + : base(templateDefinitionManager, templateContentProvider, stringLocalizerFactory) { - _templateContentProvider = templateContentProvider; - _templateDefinitionManager = templateDefinitionManager; - _stringLocalizerFactory = stringLocalizerFactory; } - public virtual async Task RenderAsync( + public override async Task RenderAsync( [NotNull] string templateName, [CanBeNull] object model = null, [CanBeNull] string cultureName = null, @@ -64,7 +61,7 @@ namespace Volo.Abp.TextTemplating.Scriban Dictionary globalContext, object model = null) { - var templateDefinition = _templateDefinitionManager.Get(templateName); + var templateDefinition = TemplateDefinitionManager.Get(templateName); var renderedContent = await RenderSingleTemplateAsync( templateDefinition, @@ -89,10 +86,7 @@ namespace Volo.Abp.TextTemplating.Scriban Dictionary globalContext, object model = null) { - var rawTemplateContent = await _templateContentProvider - .GetContentOrNullAsync( - templateDefinition - ); + var rawTemplateContent = await GetContentOrNullAsync(templateDefinition); return await RenderTemplateContentWithScribanAsync( templateDefinition, @@ -146,15 +140,5 @@ namespace Volo.Abp.TextTemplating.Scriban return context; } - - private IStringLocalizer GetLocalizerOrNull(TemplateDefinition templateDefinition) - { - if (templateDefinition.LocalizationResource != null) - { - return _stringLocalizerFactory.Create(templateDefinition.LocalizationResource); - } - - return _stringLocalizerFactory.CreateDefaultOrNull(); - } } } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs index d5817d0d33..4a94f3bb23 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs @@ -1,11 +1,11 @@ -using Volo.Abp.Modularity; +using System; +using Volo.Abp.Modularity; using Volo.Abp.TextTemplating.Scriban; namespace Volo.Abp.TextTemplating { - [DependsOn( - typeof(AbpTextTemplatingScribanModule) - )] + [Obsolete("Use AbpTextTemplatingScribanModule or AbpTextTemplatingRazorModule, This module will remove in the future.")] + [DependsOn(typeof(AbpTextTemplatingScribanModule))] public class AbpTextTemplatingModule : AbpModule { diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj index ca26b60a4b..7161e0520a 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj @@ -15,7 +15,6 @@ - diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs index 53eaf0fc80..28ecb6db52 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs @@ -14,11 +14,11 @@ namespace Volo.Abp.TextTemplating.Razor new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Volo", "Abp", "TextTemplating", "Razor")))); - WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Welcome @Model.Name to the abp.io!"; - WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Merhaba @Model.Name, abp.io'ya hoşgeldiniz!"; } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs similarity index 96% rename from framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs rename to framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs index 07da572c1e..04e2d1b029 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs @@ -4,11 +4,11 @@ using Xunit; namespace Volo.Abp.TextTemplating.Razor { - public class RazorTemplateRenderer_Tests : AbpTextTemplatingTestBase + public class RazorTemplateRendererProvider_Tests : AbpTextTemplatingTestBase { private readonly ITemplateRenderer _templateRenderer; - public RazorTemplateRenderer_Tests() + public RazorTemplateRendererProvider_Tests() { _templateRenderer = GetRequiredService(); } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs index 3bb1d7f831..08576275f6 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs @@ -7,16 +7,20 @@ namespace Volo.Abp.TextTemplating.Razor public override void Define(ITemplateDefinitionContext context) { context.GetOrNull(TestTemplates.WelcomeEmail)? - .WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false); + .WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false) + .WithRazorTemplate(); context.GetOrNull(TestTemplates.ForgotPasswordEmail)? - .WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.cshtml", true); + .WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.cshtml", true) + .WithRazorTemplate(); context.GetOrNull(TestTemplates.TestTemplateLayout1)? - .WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.cshtml", true); + .WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.cshtml", true) + .WithRazorTemplate(); context.GetOrNull(TestTemplates.ShowDecimalNumber)? - .WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.cshtml", true); + .WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.cshtml", true) + .WithRazorTemplate(); context.Add(new TemplateDefinition(RazorTestTemplates.TestTemplate).WithVirtualFilePath("/SampleTemplates/TestTemplate.cshtml", true)); } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs index df2f8b3b3d..74d7add887 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs @@ -5,7 +5,6 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating.Razor { [DependsOn( - typeof(AbpTextTemplatingRazorModule), typeof(AbpTextTemplatingTestModule) )] public class RazorTextTemplatingTestModule : AbpModule diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs index 5634ccfa2c..5bbb267613 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs @@ -7,15 +7,15 @@ namespace Volo.Abp.TextTemplating.Razor { public RazorVirtualFileTemplateContributor_Tests() { - WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Welcome @Model.Name to the abp.io!"; - WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "Merhaba @Model.Name, abp.io'ya hoşgeldiniz!"; - ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + + ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase" + Environment.NewLine + "@Localizer[\"HelloText\", Model.Name], @Localizer[\"HowAreYou\"]. Please click to the following link to get an email to reset your password!"; } diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml index e02bc728ab..360e5b2a7c 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase @Localizer["HelloText", Model.Name], @Localizer["HowAreYou"]. Please click to the following link to get an email to reset your password! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml index d309dc5a2b..64a133f903 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase @Model.Amount \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml index 410bfe1240..af025d39c3 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase Welcome @Model.Name to the abp.io! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml index 7ea3c8802a..c17e07bee1 100644 --- a/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml +++ b/framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml @@ -1,2 +1,2 @@ -@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase Merhaba @Model.Name, abp.io'ya hoşgeldiniz! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj index d17a4d46fa..1cdcf89ab9 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj @@ -6,7 +6,7 @@ net5.0 - + Always @@ -15,7 +15,6 @@ - diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs similarity index 96% rename from framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs rename to framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs index a076301919..cc0e45828b 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs @@ -5,11 +5,11 @@ using Xunit; namespace Volo.Abp.TextTemplating.Scriban { - public class ScribanTemplateRenderer_Tests : AbpTextTemplatingTestBase + public class ScribanTemplateRendererProvider_Tests : AbpTextTemplatingTestBase { private readonly ITemplateRenderer _templateRenderer; - public ScribanTemplateRenderer_Tests() + public ScribanTemplateRendererProvider_Tests() { _templateRenderer = GetRequiredService(); } diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs index 956c376fd0..10de5d2886 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs @@ -5,16 +5,20 @@ public override void Define(ITemplateDefinitionContext context) { context.GetOrNull(TestTemplates.WelcomeEmail)? - .WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false); + .WithVirtualFilePath("/SampleTemplates/WelcomeEmail", false) + .WithScribanTemplate(); context.GetOrNull(TestTemplates.ForgotPasswordEmail)? - .WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.tpl", true); + .WithVirtualFilePath("/SampleTemplates/ForgotPasswordEmail.tpl", true) + .WithScribanTemplate(); context.GetOrNull(TestTemplates.TestTemplateLayout1)? - .WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.tpl", true); + .WithVirtualFilePath("/SampleTemplates/TestTemplateLayout1.tpl", true) + .WithScribanTemplate(); context.GetOrNull(TestTemplates.ShowDecimalNumber)? - .WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.tpl", true); + .WithVirtualFilePath("/SampleTemplates/ShowDecimalNumber.tpl", true) + .WithScribanTemplate(); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs index 2ed2e51b56..ff9da00c36 100644 --- a/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs +++ b/framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs @@ -4,7 +4,6 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating.Scriban { [DependsOn( - typeof(AbpTextTemplatingScribanModule), typeof(AbpTextTemplatingTestModule) )] public class ScribanTextTemplatingTestModule : AbpModule diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj index 65983605be..b4964ed8e3 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj @@ -10,12 +10,22 @@ + + Always + + + + Always + + - + + + diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs index 74174ea690..66577cea75 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs @@ -1,13 +1,18 @@ -using Volo.Abp.Autofac; +using System.Collections.Generic; +using Microsoft.CodeAnalysis; +using Volo.Abp.Autofac; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.TextTemplating.Localization; +using Volo.Abp.TextTemplating.Razor; +using Volo.Abp.TextTemplating.Scriban; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating { [DependsOn( - typeof(AbpTextTemplatingAbstractionsModule), + typeof(AbpTextTemplatingScribanModule), + typeof(AbpTextTemplatingRazorModule), typeof(AbpTestBaseModule), typeof(AbpAutofacModule), typeof(AbpLocalizationModule) @@ -27,6 +32,15 @@ namespace Volo.Abp.TextTemplating .Add("en") .AddVirtualJson("/Localization"); }); + + Configure(options => + { + options.TemplateReferences.Add(TestTemplates.HybridTemplateRazor, + new List() + { + MetadataReference.CreateFromFile(typeof(AbpTextTemplatingTestModule).Assembly.Location) + }); + }); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs new file mode 100644 index 0000000000..f6fffc89a7 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs @@ -0,0 +1,46 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.TextTemplating +{ + public class HybridTemplateRendererProvider_Tests : AbpTextTemplatingTestBase + { + private readonly ITemplateRenderer _templateRenderer; + + public HybridTemplateRendererProvider_Tests() + { + _templateRenderer = GetRequiredService(); + } + + [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; } + } + + } +} diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml new file mode 100644 index 0000000000..02cf7a82a8 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml @@ -0,0 +1,2 @@ +@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase +Hello @Model.Name, @Localizer["HowAreYou"] \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl new file mode 100644 index 0000000000..d1b39f873c --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl @@ -0,0 +1 @@ +Hello {{model.name}}, {{L "HowAreYou" }} \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs index 289bf1b04f..0015150288 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs @@ -1,4 +1,6 @@ using Volo.Abp.TextTemplating.Localization; +using Volo.Abp.TextTemplating.Razor; +using Volo.Abp.TextTemplating.Scriban; namespace Volo.Abp.TextTemplating { @@ -35,6 +37,26 @@ namespace Volo.Abp.TextTemplating layout: TestTemplates.TestTemplateLayout1 ) ); + + context.Add( + new TemplateDefinition( + TestTemplates.HybridTemplateScriban, + localizationResource: typeof(TestLocalizationSource), + layout: null + ) + .WithVirtualFilePath("/SampleTemplates/TestScribanTemplate.tpl", true) + .WithScribanTemplate() + ); + + context.Add( + new TemplateDefinition( + TestTemplates.HybridTemplateRazor, + localizationResource: typeof(TestLocalizationSource), + layout: null + ) + .WithVirtualFilePath("/SampleTemplates/TestRazorTemplate.cshtml", true) + .WithRazorTemplate() + ); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs index 29a8604f3b..25d8223b78 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs @@ -6,5 +6,8 @@ public const string ForgotPasswordEmail = "ForgotPasswordEmail"; public const string TestTemplateLayout1 = "TestTemplateLayout1"; public const string ShowDecimalNumber = "ShowDecimalNumber"; + + public const string HybridTemplateRazor = "HybridTemplateRazor"; + public const string HybridTemplateScriban = "HybridTemplateScriban"; } -} \ No newline at end of file +} diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index cc20eac8bc..25e6eefd4a 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -139,8 +139,8 @@ $projects = ( "framework/src/Volo.Abp.Sms.Aliyun", "framework/src/Volo.Abp.Specifications", "framework/src/Volo.Abp.TestBase", - "framework/src/Volo.Abp.TextTemplating.Abstractions", "framework/src/Volo.Abp.TextTemplating", + "framework/src/Volo.Abp.TextTemplating.Core", "framework/src/Volo.Abp.TextTemplating.Razor", "framework/src/Volo.Abp.TextTemplating.Scriban", "framework/src/Volo.Abp.Threading",