Browse Source

Merge pull request #8673 from abpframework/maliming/multiple-template-engine

Supports the use of multiple template rendering engines in one application.
pull/8880/head
Halil İbrahim Kalkan 6 years ago
committed by GitHub
parent
commit
dd02ffe0f6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      docs/en/Text-Templating-Razor.md
  2. 15
      docs/en/Text-Templating-Scriban.md
  3. 2
      docs/en/Text-Templating.md
  4. 2
      framework/Volo.Abp.sln
  5. 0
      framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xml
  6. 0
      framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xsd
  7. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.csproj
  8. 55
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTemplateRenderer.cs
  9. 2
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingCoreModule.cs
  10. 10
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs
  11. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentContributor.cs
  12. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentProvider.cs
  13. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs
  14. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs
  15. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs
  16. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderer.cs
  17. 27
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderingEngine.cs
  18. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs
  19. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentProvider.cs
  20. 14
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs
  21. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs
  22. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs
  23. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs
  24. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs
  25. 42
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateRenderingEngineBase.cs
  26. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs
  27. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs
  28. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs
  29. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs
  30. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs
  31. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs
  32. 0
      framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs
  33. 2
      framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj
  34. 17
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/AbpTextTemplatingRazorModule.cs
  35. 12
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateDefinitionExtensions.cs
  36. 40
      framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderingEngine.cs
  37. 2
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj
  38. 11
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/AbpTextTemplatingScribanModule.cs
  39. 12
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateDefinitionExtensions.cs
  40. 34
      framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderingEngine.cs
  41. 8
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs
  42. 1
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj
  43. 4
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorLocalizedTemplateContentReaderFactory_Tests.cs
  44. 4
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRendererProvider_Tests.cs
  45. 12
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTestTemplateDefinitionProvider.cs
  46. 1
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTextTemplatingTestModule.cs
  47. 6
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorVirtualFileTemplateContributor_Tests.cs
  48. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml
  49. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml
  50. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/en.cshtml
  51. 2
      framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/WelcomeEmail/tr.cshtml
  52. 3
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj
  53. 4
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRendererProvider_Tests.cs
  54. 12
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTestTemplateDefinitionProvider.cs
  55. 1
      framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTextTemplatingTestModule.cs
  56. 12
      framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj
  57. 18
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs
  58. 46
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/HybridTemplateRendererProvider_Tests.cs
  59. 2
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml
  60. 1
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl
  61. 22
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs
  62. 5
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplates.cs
  63. 2
      nupkg/common.ps1

15
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
)

15
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
)

2
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.

2
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

0
framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xml → framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xml

0
framework/src/Volo.Abp.TextTemplating.Abstractions/FodyWeavers.xsd → framework/src/Volo.Abp.TextTemplating.Core/FodyWeavers.xsd

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo.Abp.TextTemplating.Abstractions.csproj → framework/src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.csproj

55
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<AbpTextTemplatingOptions> options)
{
ServiceScopeFactory = serviceScopeFactory;
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 = 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);
}
}
}

2
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingAbstractionsModule.cs → 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)
{

10
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/AbpTextTemplatingOptions.cs → 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<ITemplateDefinitionProvider> DefinitionProviders { get; }
public ITypeList<ITemplateContentContributor> ContentContributors { get; }
public IDictionary<string, Type> RenderingEngines { get; }
public string DefaultRenderingEngine { get; set; }
public AbpTextTemplatingOptions()
{
DefinitionProviders = new TypeList<ITemplateDefinitionProvider>();
ContentContributors = new TypeList<ITemplateContentContributor>();
RenderingEngines = new Dictionary<string, Type>();
}
}
}
}

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentContributor.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentContributor.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateContentProvider.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateContentProvider.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionContext.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionManager.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateDefinitionProvider.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/ITemplateRenderer.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/ITemplateRenderer.cs

27
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; }
/// <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
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateContentProvider.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateContentProvider.cs

14
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinition.cs → 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; }
/// <summary>
/// Gets/sets a key-value on the <see cref="Properties"/>.
/// </summary>
@ -84,5 +87,14 @@ namespace Volo.Abp.TextTemplating
Properties[key] = value;
return this;
}
/// <summary>
/// Sets the Render Engine of <see cref="TemplateDefinition"/>.
/// </summary>
public virtual TemplateDefinition WithRenderEngine(string renderEngine)
{
RenderEngine = renderEngine;
return this;
}
}
}
}

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionContext.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionExtensions.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionManager.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinitionProvider.cs

42
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<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
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReaderFactory.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs

0
framework/src/Volo.Abp.TextTemplating.Abstractions/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs → framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs

2
framework/src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.TextTemplating.Abstractions\Volo.Abp.TextTemplating.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Core\Volo.Abp.TextTemplating.Core.csproj" />
</ItemGroup>
<ItemGroup>

17
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<AbpTextTemplatingOptions>(options =>
{
if (options.DefaultRenderingEngine.IsNullOrWhiteSpace())
{
options.DefaultRenderingEngine = RazorTemplateRenderingEngine.EngineName;
}
options.RenderingEngines[RazorTemplateRenderingEngine.EngineName] = typeof(RazorTemplateRenderingEngine);
});
}
}
}

12
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);
}
}
}

40
framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer.cs → 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<string> RenderAsync(
public override async Task<string> RenderAsync(
[NotNull] string templateName,
[CanBeNull] object model = null,
[CanBeNull] string cultureName = null,
@ -74,7 +74,7 @@ namespace Volo.Abp.TextTemplating.Razor
Dictionary<string, object> 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<string, object> 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();
}
}
}

2
framework/src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.TextTemplating.Abstractions\Volo.Abp.TextTemplating.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Core\Volo.Abp.TextTemplating.Core.csproj" />
</ItemGroup>
<ItemGroup>

11
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<AbpTextTemplatingOptions>(options =>
{
options.DefaultRenderingEngine = ScribanTemplateRenderingEngine.EngineName;
options.RenderingEngines[ScribanTemplateRenderingEngine.EngineName] = typeof(ScribanTemplateRenderingEngine);
});
}
}
}

12
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);
}
}
}

34
framework/src/Volo.Abp.TextTemplating.Scriban/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer.cs → 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<string> RenderAsync(
public override async Task<string> RenderAsync(
[NotNull] string templateName,
[CanBeNull] object model = null,
[CanBeNull] string cultureName = null,
@ -64,7 +61,7 @@ namespace Volo.Abp.TextTemplating.Scriban
Dictionary<string, object> 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<string, object> 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();
}
}
}

8
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
{

1
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj

@ -15,7 +15,6 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Razor\Volo.Abp.TextTemplating.Razor.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Tests\Volo.Abp.TextTemplating.Tests.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

4
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<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Welcome @Model.Name to the abp.io!";
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Merhaba @Model.Name, abp.io'ya hoşgeldiniz!";
}

4
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/RazorTemplateRenderer_Tests.cs → 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<RazorTextTemplatingTestModule>
public class RazorTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<RazorTextTemplatingTestModule>
{
private readonly ITemplateRenderer _templateRenderer;
public RazorTemplateRenderer_Tests()
public RazorTemplateRendererProvider_Tests()
{
_templateRenderer = GetRequiredService<ITemplateRenderer>();
}

12
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));
}

1
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

6
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<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Welcome @Model.Name to the abp.io!";
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.WelcomeEmailModel>" +
WelcomeEmailTurkishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.WelcomeEmailModel>" +
Environment.NewLine +
"Merhaba @Model.Name, abp.io'ya hoşgeldiniz!";
ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRenderer_Tests.ForgotPasswordEmailModel>" +
ForgotPasswordEmailEnglishContent = "@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.Razor.RazorTemplateRendererProvider_Tests.ForgotPasswordEmailModel>" +
Environment.NewLine +
"@Localizer[\"HelloText\", Model.Name], @Localizer[\"HowAreYou\"]. Please click to the following link to get an email to reset your password!";
}

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ForgotPasswordEmail.cshtml

@ -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!

2
framework/test/Volo.Abp.TextTemplating.Razor.Tests/Volo/Abp/TextTemplating/Razor/SampleTemplates/ShowDecimalNumber.cshtml

@ -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

2
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<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!

2
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<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!

3
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj

@ -6,7 +6,7 @@
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\TextTemplating\Scriban\SampleTemplates\**\*.tpl">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -15,7 +15,6 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Scriban\Volo.Abp.TextTemplating.Scriban.csproj" />
<ProjectReference Include="..\Volo.Abp.TextTemplating.Tests\Volo.Abp.TextTemplating.Tests.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

4
framework/test/Volo.Abp.TextTemplating.Scriban.Tests/Volo/Abp/TextTemplating/Scriban/ScribanTemplateRenderer_Tests.cs → 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<ScribanTextTemplatingTestModule>
public class ScribanTemplateRendererProvider_Tests : AbpTextTemplatingTestBase<ScribanTextTemplatingTestModule>
{
private readonly ITemplateRenderer _templateRenderer;
public ScribanTemplateRenderer_Tests()
public ScribanTemplateRendererProvider_Tests()
{
_templateRenderer = GetRequiredService<ITemplateRenderer>();
}

12
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();
}
}
}

1
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

12
framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj

@ -10,12 +10,22 @@
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\TextTemplating\Localization\**\*.json" />
<None Remove="Volo\Abp\TextTemplating\Localization\**\*.json" />
<EmbeddedResource Include="Volo\Abp\TextTemplating\SampleTemplates\**\*.cshtml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<None Remove="Volo\Abp\TextTemplating\SampleTemplates\**\*.cshtml" />
<EmbeddedResource Include="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<None Remove="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Abstractions\Volo.Abp.TextTemplating.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating\Volo.Abp.TextTemplating.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Scriban\Volo.Abp.TextTemplating.Scriban.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating.Razor\Volo.Abp.TextTemplating.Razor.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />
</ItemGroup>

18
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<TestLocalizationSource>("en")
.AddVirtualJson("/Localization");
});
Configure<AbpCompiledViewProviderOptions>(options =>
{
options.TemplateReferences.Add(TestTemplates.HybridTemplateRazor,
new List<PortableExecutableReference>()
{
MetadataReference.CreateFromFile(typeof(AbpTextTemplatingTestModule).Assembly.Location)
});
});
}
}
}

46
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<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; }
}
}
}

2
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestRazorTemplate.cshtml

@ -0,0 +1,2 @@
@inherits Volo.Abp.TextTemplating.Razor.RazorTemplatePageBase<Volo.Abp.TextTemplating.HybridTemplateRendererProvider_Tests.HybridModel>
Hello @Model.Name, @Localizer["HowAreYou"]

1
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/TestScribanTemplate.tpl

@ -0,0 +1 @@
Hello {{model.name}}, {{L "HowAreYou" }}

22
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()
);
}
}
}

5
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";
}
}
}

2
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",

Loading…
Cancel
Save