private void TraverseResouceShapes(IList <ResourceRequiredContext> resources, ResourceType resourceType, Action <ShapeTable, ResourceRequiredContext, string> processor) { var shapeKeyPrefix = resourceType == ResourceType.Style ? "Style__" : "Script__"; var currentTheme = _themeManager.GetRequestTheme(_httpContextAccessor.Current().Request.RequestContext); var shapeTable = _shapeTableLocator.Lookup(currentTheme.Id); foreach (var resource in resources) { var fullPath = resource.Resource.GetFullPath(); if (!string.IsNullOrEmpty(fullPath)) { var shapeName = StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(fullPath); var shapeKey = shapeKeyPrefix + shapeName; // Simply included CDN stylesheets are not in the ShapeTable, so we have to check if (shapeTable.Bindings.ContainsKey(shapeKey)) { processor(shapeTable, resource, shapeKey); } else { // Maybe the original binding was removed previously and the combined shape binding remains. shapeKey = CombinedShapeKey(shapeKey); if (shapeTable.Bindings.ContainsKey(shapeKey)) { processor(shapeTable, resource, shapeKey); } } } } }
public void Discover(ShapeTableBuilder builder) { // the root page shape named 'Layout' is wrapped with 'Document' // and has an automatic zone creating behavior builder.Describe("Layout") .Configure(descriptor => descriptor.Wrappers.Add("Document")) .OnCreating(creating => creating.Create = () => new ZoneHolding(() => creating.New.Zone())) .OnCreated(created => { var layout = created.Shape; layout.Head = created.New.DocumentZone(ZoneName: "Head"); layout.Body = created.New.DocumentZone(ZoneName: "Body"); layout.Tail = created.New.DocumentZone(ZoneName: "Tail"); layout.Body.Add(created.New.PlaceChildContent(Source: layout)); layout.Content = created.New.Zone(); layout.Content.ZoneName = "Content"; layout.Content.Add(created.New.PlaceChildContent(Source: layout)); }); // 'Zone' shapes are built on the Zone base class // They have class="zone zone-{name}" // and the template can be specialized with "Zone-{Name}" base file name builder.Describe("Zone") .OnCreating(creating => creating.Create = () => new Zone()) .OnDisplaying(displaying => { var zone = displaying.Shape; string zoneName = zone.ZoneName; zone.Classes.Add("zone-" + zoneName.HtmlClassify()); zone.Classes.Add("zone"); // Zone__[ZoneName] e.g. Zone-SideBar zone.Metadata.Alternates.Add("Zone__" + zoneName); }); builder.Describe("Menu") .OnDisplaying(displaying => { var menu = displaying.Shape; string menuName = menu.MenuName; menu.Classes.Add("menu-" + menuName.HtmlClassify()); menu.Classes.Add("menu"); menu.Metadata.Alternates.Add("Menu__" + EncodeAlternateElement(menuName)); }); builder.Describe("MenuItem") .OnDisplaying(displaying => { var menuItem = displaying.Shape; var menu = menuItem.Menu; int level = menuItem.Level; menuItem.Metadata.Alternates.Add("MenuItem__level__" + level); menuItem.Metadata.Alternates.Add("MenuItem__" + EncodeAlternateElement(menu.MenuName)); menuItem.Metadata.Alternates.Add("MenuItem__" + EncodeAlternateElement(menu.MenuName) + "__level__" + level); }); builder.Describe("MenuItemLink") .OnDisplaying(displaying => { var menuItem = displaying.Shape; string menuName = menuItem.Menu.MenuName; string contentType = null; int level = menuItem.Level; if (menuItem.Content != null) { contentType = ((IContent)menuItem.Content).ContentItem.ContentType; } menuItem.Metadata.Alternates.Add("MenuItemLink__level__" + level); // MenuItemLink__[ContentType] e.g. MenuItemLink-HtmlMenuItem // MenuItemLink__[ContentType]__level__[level] e.g. MenuItemLink-HtmlMenuItem-level-2 if (contentType != null) { menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(contentType)); menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(contentType) + "__level__" + level); } // MenuItemLink__[MenuName] e.g. MenuItemLink-Main-Menu // MenuItemLink__[MenuName]__level__[level] e.g. MenuItemLink-Main-Menu-level-2 menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(menuName)); menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(menuName) + "__level__" + level); // MenuItemLink__[MenuName]__[ContentType] e.g. MenuItemLink-Main-Menu-HtmlMenuItem // MenuItemLink__[MenuName]__[ContentType] e.g. MenuItemLink-Main-Menu-HtmlMenuItem-level-2 if (contentType != null) { menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(menuName) + "__" + EncodeAlternateElement(contentType)); menuItem.Metadata.Alternates.Add("MenuItemLink__" + EncodeAlternateElement(menuName) + "__" + EncodeAlternateElement(contentType) + "__level__" + level); } }); builder.Describe("LocalMenu") .OnDisplaying(displaying => { var menu = displaying.Shape; string menuName = menu.MenuName; menu.Classes.Add("localmenu-" + menuName.HtmlClassify()); menu.Classes.Add("localmenu"); menu.Metadata.Alternates.Add("LocalMenu__" + EncodeAlternateElement(menuName)); }); builder.Describe("LocalMenuItem") .OnDisplaying(displaying => { var menuItem = displaying.Shape; var menu = menuItem.Menu; menuItem.Metadata.Alternates.Add("LocalMenuItem__" + EncodeAlternateElement(menu.MenuName)); }); #region Pager alternates builder.Describe("Pager") .OnDisplaying(displaying => { var pager = displaying.Shape; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_Gap") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { pager.Metadata.Alternates.Add("Pager_Gap__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_First") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_First__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_Previous") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_Previous__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_Next") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_Next__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_Last") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_Last__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_CurrentPage") .OnDisplaying(displaying => { var pager = displaying.Shape.Pager; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_CurrentPage__" + EncodeAlternateElement(pagerId)); } }); builder.Describe("Pager_Links") .OnDisplaying(displaying => { var pager = displaying.Shape; string pagerId = pager.PagerId; if (!String.IsNullOrWhiteSpace(pagerId)) { displaying.Shape.Metadata.Alternates.Add("Pager_Links__" + EncodeAlternateElement(pagerId)); } }); #endregion // 'List' shapes start with several empty collections builder.Describe("List") .OnCreated(created => { var list = created.Shape; list.Tag = "ul"; list.ItemClasses = new List <string>(); list.ItemAttributes = new Dictionary <string, string>(); }); builder.Describe("Style") .OnDisplaying(displaying => { var resource = displaying.Shape; string url = resource.Url; var fileName = url != null ? StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url) : default(string); if (!string.IsNullOrEmpty(fileName)) { resource.Metadata.Alternates.Add("Style__" + fileName); } }); builder.Describe("Script") .OnDisplaying(displaying => { var resource = displaying.Shape; string url = resource.Url; var fileName = url != null ? StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url) : default(string); if (!string.IsNullOrEmpty(fileName)) { resource.Metadata.Alternates.Add("Script__" + fileName); } }); builder.Describe("Resource") .OnDisplaying(displaying => { var resource = displaying.Shape; string url = resource.Url; var fileName = url != null ? StaticFileBindingStrategy.GetAlternateShapeNameFromFileName(url) : default(string); if (!string.IsNullOrEmpty(fileName)) { resource.Metadata.Alternates.Add("Resource__" + fileName); } }); }