From 421afa9747dc1b3205e6bb8f5d8e6f1ca4a86a13 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 26 Sep 2012 17:22:41 -0700 Subject: [PATCH] #18829: Making scripts overridable by other modules Work Item: 18829 --HG-- branch : 1.x --- src/Orchard.Web/Core/Shapes/CoreShapes.cs | 22 +++++++- .../StylesheetBindingStrategy.cs | 55 ++++++++++++++++--- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/Orchard.Web/Core/Shapes/CoreShapes.cs b/src/Orchard.Web/Core/Shapes/CoreShapes.cs index f76b03b47..d226aec5d 100644 --- a/src/Orchard.Web/Core/Shapes/CoreShapes.cs +++ b/src/Orchard.Web/Core/Shapes/CoreShapes.cs @@ -202,17 +202,27 @@ namespace Orchard.Core.Shapes { .OnDisplaying(displaying => { var resource = displaying.Shape; string url = resource.Url; - string fileName = StylesheetBindingStrategy.GetAlternateShapeNameFromFileName(url); + string fileName = StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url); if (!string.IsNullOrEmpty(fileName)) { resource.Metadata.Alternates.Add("Style__" + fileName); } }); + builder.Describe("Script") + .OnDisplaying(displaying => { + var resource = displaying.Shape; + string url = resource.Url; + string fileName = StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url); + if (!string.IsNullOrEmpty(fileName)) { + resource.Metadata.Alternates.Add("Script__" + fileName); + } + }); + builder.Describe("Resource") .OnDisplaying(displaying => { var resource = displaying.Shape; string url = resource.Url; - string fileName = StylesheetBindingStrategy.GetAlternateShapeNameFromFileName(url); + string fileName = StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url); if (!string.IsNullOrEmpty(fileName)) { resource.Metadata.Alternates.Add("Resource__" + fileName); } @@ -330,6 +340,11 @@ namespace Orchard.Core.Shapes { ResourceManager.WriteResource(Html.ViewContext.Writer, Resource, Url, Condition, TagAttributes); } + [Shape] + public void Script(TextWriter Output, ResourceDefinition Resource, string Url, string Condition, Dictionary TagAttributes) { + ResourceManager.WriteResource(Output, Resource, Url, Condition, TagAttributes); + } + [Shape] public void Resource(TextWriter Output, ResourceDefinition Resource, string Url, string Condition, Dictionary TagAttributes) { ResourceManager.WriteResource(Output, Resource, Url, Condition, TagAttributes); @@ -376,6 +391,9 @@ namespace Orchard.Core.Shapes { if (resourceType == "stylesheet") { result = Display.Style(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } + else if (resourceType == "script") { + result = Display.Script(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes); + } else { result = Display.Resource(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } diff --git a/src/Orchard/DisplayManagement/Descriptors/ResourceBindingStrategy/StylesheetBindingStrategy.cs b/src/Orchard/DisplayManagement/Descriptors/ResourceBindingStrategy/StylesheetBindingStrategy.cs index fe3082b5b..dd17b280d 100644 --- a/src/Orchard/DisplayManagement/Descriptors/ResourceBindingStrategy/StylesheetBindingStrategy.cs +++ b/src/Orchard/DisplayManagement/Descriptors/ResourceBindingStrategy/StylesheetBindingStrategy.cs @@ -3,7 +3,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text.RegularExpressions; using Orchard.Environment.Descriptor.Models; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; @@ -12,19 +11,23 @@ using Orchard.UI.Resources; using Orchard.Utility.Extensions; namespace Orchard.DisplayManagement.Descriptors.ResourceBindingStrategy { - // discovers .css files and turns them into Style__ shapes. - public class StylesheetBindingStrategy : IShapeTableProvider { + // discovers static files and turns them into shapes. + public abstract class StaticFileBindingStrategy { private readonly IExtensionManager _extensionManager; private readonly ShellDescriptor _shellDescriptor; private readonly IVirtualPathProvider _virtualPathProvider; private static readonly char[] unsafeCharList = "/:?#[]@!&'()*+,;=\r\n\t\f\" <>.-_".ToCharArray(); - public StylesheetBindingStrategy(IExtensionManager extensionManager, ShellDescriptor shellDescriptor, IVirtualPathProvider virtualPathProvider) { + protected StaticFileBindingStrategy(IExtensionManager extensionManager, ShellDescriptor shellDescriptor, IVirtualPathProvider virtualPathProvider) { _extensionManager = extensionManager; _shellDescriptor = shellDescriptor; _virtualPathProvider = virtualPathProvider; } + public abstract string GetFileExtension(); + public abstract string GetFolder(); + public abstract string GetShapePrefix(); + private static string SafeName(string name) { if (string.IsNullOrWhiteSpace(name)) return String.Empty; @@ -59,14 +62,14 @@ namespace Orchard.DisplayManagement.Descriptors.ResourceBindingStrategy { var hits = activeExtensions.SelectMany(extensionDescriptor => { var basePath = Path.Combine(extensionDescriptor.Location, extensionDescriptor.Id).Replace(Path.DirectorySeparatorChar, '/'); - var virtualPath = Path.Combine(basePath, "Styles").Replace(Path.DirectorySeparatorChar, '/'); + var virtualPath = Path.Combine(basePath, GetFolder()).Replace(Path.DirectorySeparatorChar, '/'); var shapes = _virtualPathProvider.ListFiles(virtualPath) .Select(Path.GetFileName) - .Where(fileName => string.Equals(Path.GetExtension(fileName), ".css", System.StringComparison.OrdinalIgnoreCase)) + .Where(fileName => string.Equals(Path.GetExtension(fileName), GetFileExtension(), StringComparison.OrdinalIgnoreCase)) .Select(cssFileName => new { fileName = Path.GetFileNameWithoutExtension(cssFileName), fileVirtualPath = Path.Combine(virtualPath, cssFileName).Replace(Path.DirectorySeparatorChar, '/'), - shapeType = "Style__" + GetAlternateShapeNameFromFileName(cssFileName), + shapeType = GetShapePrefix() + GetAlternateShapeNameFromFileName(cssFileName), extensionDescriptor }); return shapes; @@ -98,4 +101,42 @@ namespace Orchard.DisplayManagement.Descriptors.ResourceBindingStrategy { _shellDescriptor.Features.Any(sf => sf.Name == fd.Id); } } + + // discovers .css files and turns them into Style__ shapes. + public class StylesheetBindingStrategy : StaticFileBindingStrategy, IShapeTableProvider { + public StylesheetBindingStrategy(IExtensionManager extensionManager, ShellDescriptor shellDescriptor, IVirtualPathProvider virtualPathProvider) : base(extensionManager, shellDescriptor, virtualPathProvider) { + } + + public override string GetFileExtension() { + return ".css"; + } + + public override string GetFolder() { + return "Styles"; + } + + public override string GetShapePrefix() { + return "Style__"; + } + } + + // discovers .css files and turns them into Style__ shapes. + public class ScriptBindingStrategy : StaticFileBindingStrategy, IShapeTableProvider { + public ScriptBindingStrategy(IExtensionManager extensionManager, ShellDescriptor shellDescriptor, IVirtualPathProvider virtualPathProvider) + : base(extensionManager, shellDescriptor, virtualPathProvider) { + } + + public override string GetFileExtension() { + return ".js"; + } + + public override string GetFolder() { + return "Scripts"; + } + + public override string GetShapePrefix() { + return "Script__"; + } + } + }