public RequireSettings RegisterResource(string resourceType, string resourceName) { if (resourceType == null) { throw new ArgumentNullException(nameof(resourceType)); } if (resourceName == null) { throw new ArgumentNullException(nameof(resourceName)); } RequireSettings settings; var key = new ResourceTypeName(resourceType, resourceName); if (!_required.TryGetValue(key, out settings)) { settings = new RequireSettings(_options.Value) { Type = resourceType, Name = resourceName }; _required[key] = settings; } _builtResources[resourceType] = null; return(settings); }
private void WriteResources(TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation) { var defaultSettings = new RequireSettings(); var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType); var appPath = _httpContextAccessor.Value.Current().Request.ApplicationPath; foreach (var context in requiredResources.Where(r => (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) && (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true))) { var path = context.GetResourceUrl(defaultSettings, appPath); var condition = context.Settings.Condition; var attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null; //需要判断是否用了cdn地址 ResourceManager.WriteResource(Output, context.Resource, !context.Resource.Url.StartsWith("http") ? (context.Resource.BasePath + context.Resource.Url) : context.Resource.Url, condition, attributes); //if (resourceType == "stylesheet") //{ // context.Resource.TagBuilder.Attributes.Add(context.Resource.FilePathAttributeName, context.Resource.Url); //} //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); //} //Output.Write(result); } }
private void VerifyPaths(string resourceType, RequireSettings defaultSettings, string expectedPaths, bool ssl) { defaultSettings = defaultSettings ?? new RequireSettings(); var requiredResources = _resourceManager.BuildRequiredResources(resourceType); var renderedResources = string.Join(",", requiredResources.Select(context => context.GetResourceUrl(defaultSettings, _appPath, ssl)).ToArray()); Assert.That(renderedResources, Is.EqualTo(expectedPaths)); }
private void WriteResources(dynamic Display, TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation) { bool debugMode; var site = _workContext.Value.CurrentSite; switch (site.ResourceDebugMode) { case ResourceDebugMode.Enabled: debugMode = true; break; case ResourceDebugMode.Disabled: debugMode = false; break; default: Debug.Assert(site.ResourceDebugMode == ResourceDebugMode.FromAppSetting, "Unknown ResourceDebugMode value."); var context = _httpContextAccessor.Value.Current(); debugMode = context != null && context.IsDebuggingEnabled; break; } var defaultSettings = new RequireSettings { DebugMode = debugMode, CdnMode = site.UseCdn, FileHashMode = site.UseFileHash, Culture = _workContext.Value.CurrentCulture, }; var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType); var httpContext = _httpContextAccessor.Value.Current(); var appPath = httpContext == null || httpContext.Request == null ? null : httpContext.Request.ApplicationPath; var ssl = httpContext != null && httpContext.Request != null && httpContext.Request.IsSecureConnection; foreach (var context in requiredResources.Where(r => (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) && (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true))) { var url = context.GetResourceUrl(defaultSettings, appPath, ssl, _resourceFileHashProvider); var condition = context.Settings.Condition; var attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null; IHtmlString result; if (resourceType == "stylesheet") { result = Display.Style(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } else if (resourceType == "script") { result = Display.Script(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } else { result = Display.Resource(Url: url, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } Output.Write(result); } }
public void GetScriptResourceWithInlineContent() { var resourceDefinition = _resourceManifest.DefineScript("foo") .SetInnerContent("console.log('foo');"); var requireSettings = new RequireSettings(); var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance); Assert.Equal("script", tagBuilder.TagName); Assert.Equal("console.log('foo');", ReadIHtmlContent(tagBuilder.InnerHtml)); }
public void GetStyleResourceWithInlineContent() { var resourceDefinition = _resourceManifest.DefineStyle("foo") .SetInnerContent("body { background-color: white; }"); var requireSettings = new RequireSettings(); var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance); Assert.Equal("style", tagBuilder.TagName); Assert.Equal("text/css", tagBuilder.Attributes["type"]); Assert.Equal("body { background-color: white; }", ReadIHtmlContent(tagBuilder.InnerHtml)); }
public void GetLocalScriptResourceWithCdnBaseUrl(string applicationPath, string url, string expected) { var resourceDefinition = _resourceManifest.DefineScript("foo") .SetUrl(url, url); var requireSettings = new RequireSettings { DebugMode = false, CdnMode = true, CdnBaseUrl = "https://hostcdn.net" }; var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance); Assert.Equal("script", tagBuilder.TagName); Assert.Equal(expected, tagBuilder.Attributes["src"]); }
public static HtmlString Resource(ResourceDefinition resource, WorkContext context) { var defaultSettings = new RequireSettings { DebugMode = context.CurrentSite.ResourceDebugMode == ResourceDebugMode.Enabled, Culture = context.CurrentCulture, }; var appPath = context.HttpContext.Request.ApplicationPath; var url = resource.ResolveUrl(defaultSettings, appPath); return(new HtmlString(File.ReadAllText(context.HttpContext.Server.MapPath(url)))); }
public void GetScriptResourceWithBasePath(string basePath) { var resourceDefinition = _resourceManifest.DefineScript("foo") .SetUrl("~/foo.js", "~/foo.debug.js") .SetBasePath(basePath); var requireSettings = new RequireSettings { DebugMode = false, CdnMode = false }; var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, String.Empty, StubFileVersionProvider.Instance); Assert.Equal("script", tagBuilder.TagName); Assert.Equal($"{basePath}/foo.js", tagBuilder.Attributes["src"]); }
public void GetScriptResourceWithCdnUrl(string applicationPath) { var resourceDefinition = _resourceManifest.DefineScript("foo") .SetUrl("~/foo.js", "~/foo.debug.js") .SetCdn("https://cdn.tld/foo.js", "https://cdn.tld/foo.debug.js"); var requireSettings = new RequireSettings { DebugMode = false, CdnMode = true }; var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance); Assert.Equal("script", tagBuilder.TagName); Assert.Equal("https://cdn.tld/foo.js", tagBuilder.Attributes["src"]); }
private OutputCacheItemResource GetCacheItemResource(RequireSettings settings) { var definition = _resourceManager.FindResource(settings); return(new OutputCacheItemResource() { Location = settings.Location, Name = settings.Name, Type = settings.Type, Url = definition.Url, UrlDebug = definition.UrlDebug, BasePath = definition.BasePath }); }
public void GetStyleResourceWithDebugCdnUrl() { var resourceDefinition = _resourceManifest.DefineStyle("foo") .SetUrl("~/foo.css", "~/foo.debug.css") .SetCdn("https://cdn.tld/foo.css", "https://cdn.tld/foo.debug.css"); var requireSettings = new RequireSettings { DebugMode = true, CdnMode = true }; var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, basePath, StubFileVersionProvider.Instance); Assert.Equal("link", tagBuilder.TagName); Assert.Equal("text/css", tagBuilder.Attributes["type"]); Assert.Equal("stylesheet", tagBuilder.Attributes["rel"]); Assert.Equal("https://cdn.tld/foo.debug.css", tagBuilder.Attributes["href"]); }
private static string StringifyAttributes(this RequireSettings settings) { if (!settings.HasAttributes) { return(""); } var sb = new StringBuilder(); foreach (var item in settings.Attributes) { sb.Append(item); } return(sb.ToString()); }
private void WriteResources(dynamic Display, TextWriter Output, string resourceType, ResourceLocation?includeLocation, ResourceLocation?excludeLocation) { bool debugMode; var site = _workContext.Value.CurrentSite; switch (site.ResourceDebugMode) { case ResourceDebugMode.Enabled: debugMode = true; break; case ResourceDebugMode.Disabled: debugMode = false; break; default: Debug.Assert(site.ResourceDebugMode == ResourceDebugMode.FromAppSetting, "Unknown ResourceDebugMode value."); debugMode = _httpContextAccessor.Value.Current().IsDebuggingEnabled; break; } var defaultSettings = new RequireSettings { DebugMode = debugMode, Culture = CultureInfo.CurrentUICulture.Name, }; var requiredResources = _resourceManager.Value.BuildRequiredResources(resourceType); var appPath = _httpContextAccessor.Value.Current().Request.ApplicationPath; foreach (var context in requiredResources.Where(r => (includeLocation.HasValue ? r.Settings.Location == includeLocation.Value : true) && (excludeLocation.HasValue ? r.Settings.Location != excludeLocation.Value : true))) { var path = context.GetResourceUrl(defaultSettings, appPath); var condition = context.Settings.Condition; var attributes = context.Settings.HasAttributes ? context.Settings.Attributes : null; IHtmlString result; if (resourceType == "stylesheet") { result = Display.Style(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } else { result = Display.Resource(Url: path, Condition: condition, Resource: context.Resource, TagAttributes: attributes); } Output.Write(result); } }
public void GetStyleResourceWithAttributes(string applicationPath) { var resourceDefinition = _resourceManifest.DefineStyle("foo") .SetUrl("~/foo.css", "~/foo.debug.css") .SetAttribute("id", "foo") .SetAttribute("media", "all"); var requireSettings = new RequireSettings { DebugMode = false, CdnMode = false }; var tagBuilder = resourceDefinition.GetTagBuilder(requireSettings, applicationPath, StubFileVersionProvider.Instance); Assert.Equal("link", tagBuilder.TagName); Assert.Equal("text/css", tagBuilder.Attributes["type"]); Assert.Equal("stylesheet", tagBuilder.Attributes["rel"]); Assert.Equal("foo", tagBuilder.Attributes["id"]); Assert.Equal("all", tagBuilder.Attributes["media"]); }
protected virtual void ExpandDependencies(ResourceDefinition resource, RequireSettings settings, OrderedDictionary allResources) { if (resource == null) { return; } // Settings is given so they can cascade down into dependencies. For example, if Foo depends on Bar, and Foo's required // location is Head, so too should Bar's location. // forge the effective require settings for this resource // (1) If a require exists for the resource, combine with it. Last settings in gets preference for its specified values. // (2) If no require already exists, form a new settings object based on the given one but with its own type/name. settings = allResources.Contains(resource) ? ((RequireSettings)allResources[resource]).Combine(settings) : new RequireSettings(_options.Value) { Type = resource.Type, Name = resource.Name }.Combine(settings); if (resource.Dependencies != null) { var dependencies = from d in resource.Dependencies let segments = d.Split(':') let name = segments[0] let version = segments.Length > 1 ? segments[1] : null select FindResource(new RequireSettings { Type = resource.Type, Name = name, Version = version }); foreach (var dependency in dependencies) { if (dependency == null) { continue; } ExpandDependencies(dependency, settings, allResources); } } allResources[resource] = settings; }
private void VerifyPaths(string resourceType, RequireSettings defaultSettings, string expectedPaths) { VerifyPaths(resourceType, defaultSettings, expectedPaths, false); }
public static bool IsConditional(this RequireSettings settings) { return(!string.IsNullOrEmpty(settings.Condition)); }
public static bool AttributesEqual(this RequireSettings settings, RequireSettings other) { return(settings.StringifyAttributes() == other.StringifyAttributes()); }
public ResourceDefinition FindResource(RequireSettings settings) { return(FindResource(settings, true)); }
private ResourceDefinition FindResource(RequireSettings settings, bool resolveInlineDefinitions) { // find the resource with the given type and name // that has at least the given version number. If multiple, // return the resource with the greatest version number. // If not found and an inlineDefinition is given, define the resource on the fly // using the action. var name = settings.Name ?? ""; var type = settings.Type; ResourceDefinition resource; var resources = (from p in ResourceManifests from r in p.GetResources(type) where name.Equals(r.Key, StringComparison.OrdinalIgnoreCase) select r.Value).SelectMany(x => x); if (!String.IsNullOrEmpty(settings.Version)) { // Specific version, filter var upper = GetUpperBoundVersion(settings.Version); var lower = GetLowerBoundVersion(settings.Version); resources = from r in resources let version = r.Version != null ? new Version(r.Version) : null where lower <= version && version < upper select r; } // Use the highest version of all matches resource = (from r in resources let version = r.Version != null ? new Version(r.Version) : null orderby version descending select r).FirstOrDefault(); if (resource == null && _dynamicManifest != null) { resources = (from r in _dynamicManifest.GetResources(type) where name.Equals(r.Key, StringComparison.OrdinalIgnoreCase) select r.Value).SelectMany(x => x); if (!String.IsNullOrEmpty(settings.Version)) { // Specific version, filter var upper = GetUpperBoundVersion(settings.Version); var lower = GetLowerBoundVersion(settings.Version); resources = from r in resources let version = r.Version != null ? new Version(r.Version) : null where lower <= version && version < upper select r; } // Use the highest version of all matches resource = (from r in resources let version = r.Version != null ? new Version(r.Version) : null orderby version descending select r).FirstOrDefault(); } if (resolveInlineDefinitions && resource == null) { // Does not seem to exist, but it's possible it is being // defined by a Define() from a RequireSettings somewhere. if (ResolveInlineDefinitions(settings.Type)) { // if any were defined, now try to find it resource = FindResource(settings, false); } } return(resource); }