mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-04-05 21:01:35 +08:00
parent
365060b7c6
commit
35d2a6c8fd
@ -150,6 +150,9 @@
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -121,6 +121,9 @@
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -488,6 +488,9 @@
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -309,6 +309,9 @@
|
||||
<EmbeddedResource Include="Recipes\Services\FoldersData\Sample1\Module.txt" />
|
||||
<EmbeddedResource Include="Recipes\Services\FoldersData\Sample1\Recipes\cms.recipe.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -9,6 +9,8 @@ using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.DisplayManagement.Shapes;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Mvc;
|
||||
using Orchard.Tests.Stubs;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement {
|
||||
[TestFixture]
|
||||
@ -25,6 +27,7 @@ namespace Orchard.Tests.DisplayManagement {
|
||||
CurrentTheme = new ExtensionDescriptor { Id = "Hello" }
|
||||
};
|
||||
|
||||
builder.RegisterType<StubHttpContextAccessor>().As<IHttpContextAccessor>();
|
||||
builder.RegisterType<DefaultDisplayManager>().As<IDisplayManager>();
|
||||
builder.RegisterType<TestShapeTableManager>().As<IShapeTableManager>();
|
||||
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
|
||||
|
@ -1,166 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Autofac;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Caching;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.DisplayManagement.Descriptors.ShapeTemplateStrategy;
|
||||
using Orchard.Environment.Descriptor.Models;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.FileSystems.VirtualPath;
|
||||
using Orchard.Tests.Stubs;
|
||||
|
||||
namespace Orchard.Tests.DisplayManagement.Descriptors {
|
||||
[TestFixture]
|
||||
public class ShapeTemplateBindingStrategyTests : ContainerTestBase {
|
||||
private ShellDescriptor _descriptor;
|
||||
private IList<FeatureDescriptor> _features;
|
||||
private TestViewEngine _testViewEngine;
|
||||
private TestVirtualPathProvider _testVirtualPathProvider;
|
||||
|
||||
|
||||
protected override void Register(ContainerBuilder builder) {
|
||||
_descriptor = new ShellDescriptor();
|
||||
_testViewEngine = new TestViewEngine();
|
||||
_testVirtualPathProvider = new TestVirtualPathProvider();
|
||||
|
||||
builder.Register(ctx => _descriptor);
|
||||
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
|
||||
builder.RegisterType<StubParallelCacheContext>().As<IParallelCacheContext>();
|
||||
builder.RegisterType<StubVirtualPathMonitor>().As<IVirtualPathMonitor>();
|
||||
builder.RegisterType<ShapeTemplateBindingStrategy>().As<IShapeTableProvider>();
|
||||
builder.RegisterType<BasicShapeTemplateHarvester>().As<IShapeTemplateHarvester>();
|
||||
builder.RegisterInstance(_testViewEngine).As<IShapeTemplateViewEngine>();
|
||||
builder.RegisterInstance(_testVirtualPathProvider).As<IVirtualPathProvider>();
|
||||
|
||||
var extensionManager = new Mock<IExtensionManager>();
|
||||
builder.Register(ctx => extensionManager);
|
||||
builder.Register(ctx => extensionManager.Object);
|
||||
}
|
||||
|
||||
public class TestViewEngine : Dictionary<string, object>, IShapeTemplateViewEngine {
|
||||
public IEnumerable<string> DetectTemplateFileNames(IEnumerable<string> fileNames) {
|
||||
return fileNames;
|
||||
}
|
||||
}
|
||||
|
||||
public class TestVirtualPathProvider : IVirtualPathProvider {
|
||||
public string Combine(params string[] paths) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string ToAppRelative(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string MapPath(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool FileExists(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Stream OpenFile(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public StreamWriter CreateText(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Stream CreateFile(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public DateTime GetFileLastWriteTimeUtc(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string GetFileHash(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string GetFileHash(string virtualPath, IEnumerable<string> dependencies) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void DeleteFile(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool DirectoryExists(string virtualPath) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void CreateDirectory(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public virtual void DeleteDirectory(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string GetDirectoryName(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public IEnumerable<string> ListFiles(string path) {
|
||||
return new List<string> {"~/Modules/Alpha/Views/AlphaShape.blah"};
|
||||
}
|
||||
|
||||
public IEnumerable<string> ListDirectories(string path) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TryFileExists(string virtualPath) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Resolve(ILifetimeScope container) {
|
||||
_features = new List<FeatureDescriptor>();
|
||||
|
||||
container.Resolve<Mock<IExtensionManager>>()
|
||||
.Setup(em => em.AvailableFeatures())
|
||||
.Returns(_features);
|
||||
}
|
||||
|
||||
void AddFeature(string name, params string[] dependencies) {
|
||||
var featureDescriptor = new FeatureDescriptor {
|
||||
Id = name,
|
||||
Dependencies = dependencies,
|
||||
Extension = new ExtensionDescriptor {
|
||||
Id = name,
|
||||
Location = "~/Modules"
|
||||
}
|
||||
};
|
||||
featureDescriptor.Extension.Features = new[] { featureDescriptor };
|
||||
|
||||
_features.Add(featureDescriptor);
|
||||
}
|
||||
|
||||
void AddEnabledFeature(string name, params string[] dependencies) {
|
||||
AddFeature(name, dependencies);
|
||||
_descriptor.Features = _descriptor.Features.Concat(new[] { new ShellFeature { Name = name } });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TemplateResolutionWorks() {
|
||||
AddEnabledFeature("Alpha");
|
||||
|
||||
_testViewEngine.Add("~/Modules/Alpha/Views/AlphaShape.blah", null);
|
||||
var strategy = _container.Resolve<IShapeTableProvider>();
|
||||
|
||||
var builder = new ShapeTableBuilder(null);
|
||||
strategy.Discover(builder);
|
||||
var alterations = builder.BuildAlterations();
|
||||
|
||||
Assert.That(alterations.Any(alteration => alteration.ShapeType.Equals("AlphaShape", StringComparison.OrdinalIgnoreCase)));
|
||||
}
|
||||
}
|
||||
}
|
@ -232,7 +232,6 @@
|
||||
<Compile Include="DisplayManagement\Descriptors\InMemoryWebSiteFolder.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\PlacementFileParserTests.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\ShapeAttributeBindingStrategyTests.cs" />
|
||||
<Compile Include="DisplayManagement\Descriptors\ShapeTemplateBindingStrategyTests.cs" />
|
||||
<Compile Include="DisplayManagement\ShapeFactoryTests.cs" />
|
||||
<Compile Include="DisplayManagement\SubsystemTests.cs" />
|
||||
<Compile Include="DisplayManagement\ShapeHelperTests.cs" />
|
||||
@ -370,6 +369,9 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Environment\Extensions\FoldersData\Sample7\Module.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -115,6 +115,9 @@
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -92,6 +92,9 @@
|
||||
<Name>Orchard.Projections</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -2,7 +2,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Orchard.Compilation.Razor;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
@ -16,15 +15,12 @@ using Orchard.Utility.Extensions;
|
||||
namespace Orchard.Templates.Drivers {
|
||||
public class ShapePartDriver : ContentPartDriver<ShapePart> {
|
||||
private readonly IEnumerable<ITemplateProcessor> _processors;
|
||||
private readonly IRazorTemplateHolder _templateHolder;
|
||||
private readonly ITransactionManager _transactions;
|
||||
|
||||
public ShapePartDriver(
|
||||
IEnumerable<ITemplateProcessor> processors,
|
||||
IRazorTemplateHolder templateHolder,
|
||||
ITransactionManager transactions) {
|
||||
_processors = processors;
|
||||
_templateHolder = templateHolder;
|
||||
_transactions = transactions;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
@ -48,7 +44,6 @@ namespace Orchard.Templates.Drivers {
|
||||
try {
|
||||
var processor = _processors.FirstOrDefault(x => String.Equals(x.Type, part.ProcessorName, StringComparison.OrdinalIgnoreCase)) ?? _processors.First();
|
||||
processor.Verify(part.Template);
|
||||
_templateHolder.Set(part.Name, part.Template);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
updater.AddModelError("", T("Template processing error: {0}", ex.Message));
|
||||
|
@ -1,19 +1,22 @@
|
||||
using Orchard.Caching;
|
||||
using Orchard.Compilation.Razor;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.Templates.Models;
|
||||
using Orchard.Templates.Services;
|
||||
|
||||
namespace Orchard.Templates.Handlers {
|
||||
public class ShapePartHandler : ContentHandler {
|
||||
private readonly IRazorTemplateHolder _razorTemplateHolder;
|
||||
private ISignals _signals;
|
||||
|
||||
public ShapePartHandler(ISignals signals, IRazorTemplateHolder razorTemplateHolder) {
|
||||
_razorTemplateHolder = razorTemplateHolder;
|
||||
public ShapePartHandler(ISignals signals) {
|
||||
_signals = signals;
|
||||
|
||||
OnUpdated<ShapePart>((ctx, part) => _razorTemplateHolder.Set(part.Name, part.Template));
|
||||
OnCreated<ShapePart>((ctx, part) => signals.Trigger(DefaultTemplateService.TemplatesSignal));
|
||||
OnRemoved<ShapePart>((ctx, part) => signals.Trigger(DefaultTemplateService.TemplatesSignal));
|
||||
OnPublished<ShapePart>((ctx, part) => InvalidateTemplatesCache());
|
||||
OnUnpublished<ShapePart>((ctx, part) => InvalidateTemplatesCache());
|
||||
OnRemoved<ShapePart>((ctx, part) => InvalidateTemplatesCache());
|
||||
}
|
||||
|
||||
public void InvalidateTemplatesCache() {
|
||||
_signals.Trigger(DefaultTemplateService.TemplatesSignal);
|
||||
}
|
||||
}
|
||||
}
|
@ -169,10 +169,13 @@
|
||||
<Compile Include="Migrations.cs" />
|
||||
<Compile Include="Services\ITemplateProcessor.cs" />
|
||||
<Compile Include="Services\ITemplateService.cs" />
|
||||
<Compile Include="Services\Razor\IRazorCompiler.cs" />
|
||||
<Compile Include="Services\Razor\RazorCompiler.cs" />
|
||||
<Compile Include="Services\Razor\RazorTemplateBase.cs" />
|
||||
<Compile Include="Services\TemplateProcessorImpl.cs" />
|
||||
<Compile Include="Services\RazorTemplateProcessor.cs" />
|
||||
<Compile Include="Services\TemplateBindingStrategy.cs" />
|
||||
<Compile Include="Services\DefaultTemplateService.cs" />
|
||||
<Compile Include="Services\TemplateShapeDisplayEvent.cs" />
|
||||
<Compile Include="Settings\ShapePartSettings.cs" />
|
||||
<Compile Include="Settings\ShapePartSettingsEvents.cs" />
|
||||
<Compile Include="ViewModels\ShapePartSettingsViewModel.cs" />
|
||||
|
@ -10,13 +10,9 @@ namespace Orchard.Templates.Services {
|
||||
|
||||
public const string TemplatesSignal = "Orchard.Templates";
|
||||
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly IEnumerable<ITemplateProcessor> _processors;
|
||||
|
||||
public DefaultTemplateService(
|
||||
IContentManager contentManager,
|
||||
IEnumerable<ITemplateProcessor> processors) {
|
||||
_contentManager = contentManager;
|
||||
public DefaultTemplateService(IEnumerable<ITemplateProcessor> processors) {
|
||||
_processors = processors;
|
||||
}
|
||||
|
||||
@ -28,10 +24,6 @@ namespace Orchard.Templates.Services {
|
||||
var processor = _processors.FirstOrDefault(x => String.Equals(x.Type, processorName, StringComparison.OrdinalIgnoreCase)) ?? _processors.First();
|
||||
return processor.Process(template, name, context, model);
|
||||
}
|
||||
|
||||
public IEnumerable<ShapePart> GetTemplates(VersionOptions versionOptions = null) {
|
||||
return _contentManager.Query<ShapePart>(versionOptions ?? VersionOptions.Published).List();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -7,6 +7,5 @@ namespace Orchard.Templates.Services {
|
||||
public interface ITemplateService : IDependency {
|
||||
string Execute<TModel>(string template, string name, string processorName, TModel model = default(TModel));
|
||||
string Execute<TModel>(string template, string name, string processorName, DisplayContext context, TModel model = default(TModel));
|
||||
IEnumerable<ShapePart> GetTemplates(VersionOptions versionOptions = null);
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Compilation.Razor {
|
||||
public interface IRazorCompiler : ICompiler {
|
||||
namespace Orchard.Templates.Compilation.Razor {
|
||||
public interface IRazorCompiler : IDependency {
|
||||
IRazorTemplateBase<TModel> CompileRazor<TModel>(string code, string name, IDictionary<string, object> parameters);
|
||||
IRazorTemplateBase CompileRazor(string code, string name, IDictionary<string, object> parameters);
|
||||
}
|
@ -13,7 +13,7 @@ using Orchard.Caching;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Utility.Extensions;
|
||||
|
||||
namespace Orchard.Compilation.Razor {
|
||||
namespace Orchard.Templates.Compilation.Razor {
|
||||
public class RazorCompiler : IRazorCompiler {
|
||||
private readonly ICacheManager _cache;
|
||||
private readonly ISignals _signals;
|
||||
@ -34,7 +34,7 @@ namespace Orchard.Compilation.Razor {
|
||||
"System.Web.Mvc.Ajax",
|
||||
"System.Web.UI",
|
||||
"System.Web.Routing",
|
||||
"Orchard.Compilation.Razor",
|
||||
"Orchard.Templates.Compilation.Razor",
|
||||
"Orchard.ContentManagement",
|
||||
"Orchard.DisplayManagement",
|
||||
"Orchard.DisplayManagement.Shapes",
|
||||
@ -63,14 +63,6 @@ namespace Orchard.Compilation.Razor {
|
||||
return (IRazorTemplateBase) Compile(code, name, null, parameters);
|
||||
}
|
||||
|
||||
public object Compile(string code, IDictionary<string, object> parameters) {
|
||||
return CompileRazor<RazorTemplateBase<dynamic>>(code, null, parameters);
|
||||
}
|
||||
|
||||
public T Compile<T>(string code, IDictionary<string, object> parameters) {
|
||||
return (T) Compile(code, null, null, parameters);
|
||||
}
|
||||
|
||||
private object Compile(string code, string name, Type modelType, IDictionary<string, object> parameters) {
|
||||
|
||||
var cacheKey = (name ?? DynamicallyGeneratedClassName) + GetHash(code);
|
@ -2,7 +2,7 @@
|
||||
using System.Web.Mvc;
|
||||
using System.Web.WebPages;
|
||||
|
||||
namespace Orchard.Compilation.Razor {
|
||||
namespace Orchard.Templates.Compilation.Razor {
|
||||
public interface IRazorTemplateBase
|
||||
{
|
||||
dynamic Model { get; }
|
@ -6,9 +6,10 @@ using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.UI;
|
||||
using System.Web.WebPages;
|
||||
using Orchard.Compilation.Razor;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.Logging;namespace Orchard.Templates.Services {
|
||||
using Orchard.Logging;
|
||||
using Orchard.Templates.Compilation.Razor;
|
||||
namespace Orchard.Templates.Services {
|
||||
public class RazorTemplateProcessor : TemplateProcessorImpl {
|
||||
private readonly IRazorCompiler _compiler;
|
||||
private readonly HttpContextBase _httpContextBase;
|
||||
|
@ -1,116 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using Orchard.Caching;
|
||||
using Orchard.Compilation.Razor;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Mvc.Spooling;
|
||||
|
||||
namespace Orchard.Templates.Services {
|
||||
public class TemplateBindingStrategy : IShapeTableProvider, IShapeTableMonitor {
|
||||
private readonly ITemplateService _templateService;
|
||||
private readonly IRazorTemplateHolder _templateProvider;
|
||||
private readonly ISignals _signals;
|
||||
|
||||
public TemplateBindingStrategy(
|
||||
ITemplateService templateService,
|
||||
IRazorTemplateHolder templateProvider,
|
||||
ISignals signals) {
|
||||
_templateService = templateService;
|
||||
_templateProvider = templateProvider;
|
||||
_signals = signals;
|
||||
}
|
||||
|
||||
public virtual Feature Feature { get; set; }
|
||||
|
||||
public void Discover(ShapeTableBuilder builder) {
|
||||
BuildShapes(builder);
|
||||
}
|
||||
|
||||
private void BuildShapes(ShapeTableBuilder builder) {
|
||||
|
||||
var shapes = _templateService.GetTemplates().Select(r =>
|
||||
new {
|
||||
r.Name,
|
||||
r.ProcessorName,
|
||||
r.Template
|
||||
})
|
||||
.ToList();
|
||||
|
||||
// Use a fake theme descriptor which will ensure the shape is used over
|
||||
// any other extension. It's also necessary to define them in the Admin
|
||||
// theme in order to process tokens
|
||||
|
||||
var fakeThemeDescriptor = new FeatureDescriptor {
|
||||
Id = "", // so that the binding is not filtered out
|
||||
Priority = 10, // so that it's higher than the themes' priority
|
||||
Extension = new ExtensionDescriptor {
|
||||
ExtensionType = DefaultExtensionTypes.Theme, // so that the binding is overriding modules
|
||||
}
|
||||
};
|
||||
|
||||
foreach (var record in shapes) {
|
||||
_templateProvider.Set(record.Name, record.Template);
|
||||
var shapeType = AdjustName(record.Name);
|
||||
|
||||
builder.Describe(shapeType)
|
||||
.From(new Feature { Descriptor = fakeThemeDescriptor })
|
||||
.BoundAs("Template::" + shapeType,
|
||||
descriptor => context => {
|
||||
var template = _templateProvider.Get(record.Name);
|
||||
return template != null ? PerformInvoke(context, record.Name, record.ProcessorName, template) : new HtmlString("");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private IHtmlString PerformInvoke(DisplayContext displayContext, string name, string type, string template)
|
||||
{
|
||||
if (String.IsNullOrEmpty(template)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var output = new HtmlStringWriter();
|
||||
output.Write(CoerceHtmlString(_templateService.Execute(template, name, type, displayContext, displayContext.Value)));
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
private string AdjustName(string name) {
|
||||
var lastDash = name.LastIndexOf('-');
|
||||
var lastDot = name.LastIndexOf('.');
|
||||
if (lastDot <= 0 || lastDot < lastDash) {
|
||||
name = Adjust(name, null);
|
||||
return name;
|
||||
}
|
||||
|
||||
var displayType = name.Substring(lastDot + 1);
|
||||
name = Adjust(name.Substring(0, lastDot), displayType);
|
||||
return name;
|
||||
}
|
||||
|
||||
private static string Adjust(string name, string displayType) {
|
||||
// Canonical shape type names must not have - or . to be compatible with display and shape api calls.
|
||||
var shapeType = name.Replace("--", "__").Replace("-", "__").Replace('.', '_');
|
||||
|
||||
if (String.IsNullOrEmpty(displayType)) {
|
||||
return shapeType;
|
||||
}
|
||||
var firstBreakingSeparator = shapeType.IndexOf("__", StringComparison.OrdinalIgnoreCase);
|
||||
if (firstBreakingSeparator <= 0) {
|
||||
return (shapeType + "_" + displayType);
|
||||
}
|
||||
|
||||
return (shapeType.Substring(0, firstBreakingSeparator) + "_" + displayType + shapeType.Substring(firstBreakingSeparator));
|
||||
}
|
||||
|
||||
private static IHtmlString CoerceHtmlString(object invoke) {
|
||||
return invoke as IHtmlString ?? (invoke != null ? new HtmlString(invoke.ToString()) : null);
|
||||
}
|
||||
|
||||
public void Monitor(Action<IVolatileToken> monitor) {
|
||||
monitor(_signals.When(DefaultTemplateService.TemplatesSignal));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
using Orchard.Caching;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.Templates.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace Orchard.Templates.Services {
|
||||
public class TemplateShapeDisplayEvent : IShapeDisplayEvents {
|
||||
private ICacheManager _cacheManager;
|
||||
private ISignals _signals;
|
||||
private IContentManager _contentManager;
|
||||
private ITemplateService _templateService;
|
||||
|
||||
public TemplateShapeDisplayEvent (
|
||||
ICacheManager cacheManager,
|
||||
ISignals signals,
|
||||
IContentManager contentManager,
|
||||
ITemplateService templateService
|
||||
) {
|
||||
_cacheManager = cacheManager;
|
||||
_signals = signals;
|
||||
_contentManager = contentManager;
|
||||
_templateService = templateService;
|
||||
}
|
||||
|
||||
public void Displaying(ShapeDisplayingContext context) {
|
||||
var processors = BuildShapeProcessors();
|
||||
Func<dynamic, IHtmlString> processor;
|
||||
|
||||
if (processors.TryGetValue(context.ShapeMetadata.Type, out processor)) {
|
||||
context.ChildContent = processor(context.Shape);
|
||||
}
|
||||
}
|
||||
|
||||
public void Displayed(ShapeDisplayedContext context) {
|
||||
}
|
||||
|
||||
public IDictionary<string, Func<dynamic, IHtmlString>> BuildShapeProcessors() {
|
||||
return _cacheManager.Get("Template.ShapeProcessors", ctx => {
|
||||
ctx.Monitor(_signals.When(DefaultTemplateService.TemplatesSignal));
|
||||
|
||||
var allTemplates = _contentManager.Query<ShapePart>().List();
|
||||
|
||||
return allTemplates.Select(x => new KeyValuePair<string, Func<dynamic, IHtmlString>>(
|
||||
x.Name,
|
||||
d => CoerceHtmlString(_templateService.Execute(x.Template, x.Name, x.ProcessorName, d))
|
||||
)).ToDictionary(x => x.Key, x => x.Value);
|
||||
});
|
||||
}
|
||||
|
||||
private static IHtmlString CoerceHtmlString(object invoke) {
|
||||
return invoke as IHtmlString ?? (invoke != null ? new HtmlString(invoke.ToString()) : null);
|
||||
}
|
||||
}
|
||||
}
|
@ -75,6 +75,9 @@
|
||||
<Name>Orchard.Templates</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -1,6 +1,10 @@
|
||||
using Autofac;
|
||||
using System.Web;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Caching;
|
||||
using Orchard.Templates.Compilation.Razor;
|
||||
using Orchard.Templates.Services;
|
||||
using Orchard.Tests.Stubs;
|
||||
|
||||
namespace Orchard.Templates.Tests {
|
||||
[TestFixture]
|
||||
@ -11,6 +15,11 @@ namespace Orchard.Templates.Tests {
|
||||
public void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterType<RazorTemplateProcessor>().As<ITemplateProcessor>();
|
||||
builder.RegisterType<RazorCompiler>().As<IRazorCompiler>();
|
||||
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
|
||||
builder.RegisterType<Signals>().As<ISignals>();
|
||||
builder.RegisterType<StubHttpContext>().As<HttpContextBase>();
|
||||
|
||||
_container = builder.Build();
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,9 @@
|
||||
<Name>Orchard.Tokens</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@ -1,8 +0,0 @@
|
||||
using Autofac;
|
||||
|
||||
namespace Orchard.Compilation {
|
||||
public class CompilersModule : Module {
|
||||
protected override void Load(ContainerBuilder builder) {
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Compilation {
|
||||
public interface ICompiler : IDependency {
|
||||
object Compile(string code, IDictionary<string, object> parameters);
|
||||
T Compile<T>(string code, IDictionary<string, object> parameters);
|
||||
}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
namespace Orchard.Compilation.Razor {
|
||||
public interface IRazorTemplateHolder : ISingletonDependency {
|
||||
string Get(string name);
|
||||
void Set(string name, string template);
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
using Autofac;
|
||||
using Orchard.ContentManagement;
|
||||
|
||||
namespace Orchard.Compilation.Razor {
|
||||
public class RazorModule : Module {
|
||||
protected override void Load(ContainerBuilder builder) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace Orchard.Compilation.Razor {
|
||||
public class RazorTemplateHolder : IRazorTemplateHolder {
|
||||
private readonly ConcurrentDictionary<string, string> _cache;
|
||||
|
||||
public RazorTemplateHolder() {
|
||||
_cache = new ConcurrentDictionary<string, string>();
|
||||
}
|
||||
public string Get(string name) {
|
||||
string template;
|
||||
return _cache.TryGetValue(name, out template) ? template : null;
|
||||
}
|
||||
|
||||
public void Set(string name, string template) {
|
||||
_cache.AddOrUpdate(name, template, (s, s1) => template);
|
||||
}
|
||||
}
|
||||
}
|
@ -17,21 +17,18 @@ namespace Orchard.DisplayManagement.Descriptors {
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly IParallelCacheContext _parallelCacheContext;
|
||||
private readonly IEnumerable<IShapeTableEventHandler> _shapeTableEventHandlers;
|
||||
private readonly IEnumerable<IShapeTableMonitor> _shapeTableMonitors;
|
||||
|
||||
public DefaultShapeTableManager(
|
||||
IEnumerable<Meta<IShapeTableProvider>> bindingStrategies,
|
||||
IExtensionManager extensionManager,
|
||||
ICacheManager cacheManager,
|
||||
IParallelCacheContext parallelCacheContext,
|
||||
IEnumerable<IShapeTableEventHandler> shapeTableEventHandlers,
|
||||
IEnumerable<IShapeTableMonitor> shapeTableMonitors
|
||||
IEnumerable<IShapeTableEventHandler> shapeTableEventHandlers
|
||||
) {
|
||||
_extensionManager = extensionManager;
|
||||
_cacheManager = cacheManager;
|
||||
_parallelCacheContext = parallelCacheContext;
|
||||
_shapeTableEventHandlers = shapeTableEventHandlers;
|
||||
_shapeTableMonitors = shapeTableMonitors;
|
||||
_bindingStrategies = bindingStrategies;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
@ -81,8 +78,6 @@ namespace Orchard.DisplayManagement.Descriptors {
|
||||
|
||||
_shapeTableEventHandlers.Invoke(ctx => ctx.ShapeTableCreated(result), Logger);
|
||||
|
||||
_shapeTableMonitors.Invoke(ctx => ctx.Monitor(x.Monitor), Logger);
|
||||
|
||||
Logger.Information("Done building shape table");
|
||||
return result;
|
||||
});
|
||||
|
@ -16,8 +16,4 @@ namespace Orchard.DisplayManagement.Descriptors {
|
||||
void ShapeTableCreated(ShapeTable shapeTable);
|
||||
}
|
||||
|
||||
public interface IShapeTableMonitor : IDependency {
|
||||
void Monitor(Action<IVolatileToken> monitor);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ using System.Web.Mvc;
|
||||
using Autofac;
|
||||
using Autofac.Configuration;
|
||||
using Orchard.Caching;
|
||||
using Orchard.Compilation.Razor;
|
||||
using Orchard.Data;
|
||||
using Orchard.Environment.AutofacUtil;
|
||||
using Orchard.Environment.Configuration;
|
||||
|
@ -146,14 +146,6 @@
|
||||
<Compile Include="Caching\DefaultParallelCacheContext.cs" />
|
||||
<Compile Include="Caching\ICacheContextAccessor.cs" />
|
||||
<Compile Include="Caching\IParallelCacheContext.cs" />
|
||||
<Compile Include="Compilation\CompilersModule.cs" />
|
||||
<Compile Include="Compilation\ICompiler.cs" />
|
||||
<Compile Include="Compilation\Razor\RazorModule.cs" />
|
||||
<Compile Include="Compilation\Razor\IRazorCompiler.cs" />
|
||||
<Compile Include="Compilation\Razor\IRazorTemplateHolder.cs" />
|
||||
<Compile Include="Compilation\Razor\RazorCompiler.cs" />
|
||||
<Compile Include="Compilation\Razor\RazorTemplateBase.cs" />
|
||||
<Compile Include="Compilation\Razor\RazorTemplateCache.cs" />
|
||||
<Compile Include="ContentManagement\Aspects\IAliasAspect.cs" />
|
||||
<Compile Include="ContentManagement\Aspects\ITitleAspect.cs" />
|
||||
<Compile Include="ContentManagement\Aspects\ILocalizableAspect.cs" />
|
||||
|
@ -104,6 +104,9 @@
|
||||
<Name>Orchard</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
Loading…
Reference in New Issue
Block a user