mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 11:44:58 +08:00
#18829: Making scripts overridable by other modules
Work Item: 18829 --HG-- branch : 1.x
This commit is contained in:
@@ -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<string, string> TagAttributes) {
|
||||
ResourceManager.WriteResource(Output, Resource, Url, Condition, TagAttributes);
|
||||
}
|
||||
|
||||
[Shape]
|
||||
public void Resource(TextWriter Output, ResourceDefinition Resource, string Url, string Condition, Dictionary<string, string> 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);
|
||||
}
|
||||
|
@@ -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__<filename> 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__<filename> 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__<filename> 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__";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user