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);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        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);
                }
            });
        }