public override ShapeResult Factory()

in src/OrchardCore/OrchardCore.ContentManagement.Display/ContentDisplay/ContentPartDisplayDriverTPart.cs [25:177]


        public override ShapeResult Factory(string shapeType, Func<IBuildShapeContext, ValueTask<IShape>> shapeBuilder, Func<IShape, Task> initializeAsync)
        {
            // e.g., HtmlBodyPart.Summary, HtmlBodyPart-BlogPost, BagPart-LandingPage-Services
            // context.Shape is the ContentItem shape, we need to alter the part shape

            var result = base.Factory(shapeType, shapeBuilder, initializeAsync).Prefix(Prefix);

            if (_typePartDefinition != null)
            {
                // The stereotype is used when not displaying for a specific content type. We don't use [Stereotype] and [ContentType] at
                // the same time in an alternate because a content type is always of one stereotype.

                var stereotype = "";

                var settings = _typePartDefinition.ContentTypeDefinition?.GetSettings<ContentTypeSettings>();

                if (settings != null)
                {
                    stereotype = settings.Stereotype;
                }

                if (!String.IsNullOrEmpty(stereotype) && !String.Equals("Content", stereotype, StringComparison.OrdinalIgnoreCase))
                {
                    stereotype += "__";
                }

                var partName = _typePartDefinition.Name;
                var partType = _typePartDefinition.PartDefinition.Name;
                var contentType = _typePartDefinition.ContentTypeDefinition.Name;
                var editorPartType = GetEditorShapeType(_typePartDefinition);
                var displayMode = _typePartDefinition.DisplayMode();
                var hasDisplayMode = !String.IsNullOrEmpty(displayMode);

                // If the shape type and the field type only differ by the display mode
                if (hasDisplayMode && shapeType == partType + DisplaySeparator + displayMode)
                {
                    // Preserve the shape name regardless its differentiator
                    result.Name(partName);
                }

                if (partType == shapeType || editorPartType == shapeType)
                {
                    // HtmlBodyPart, Services
                    result.Differentiator(partName);
                }
                else
                {
                    // ListPart-ListPartFeed
                    result.Differentiator($"{partName}-{shapeType}");
                }

                result.Displaying(ctx =>
                {
                    string[] displayTypes;

                    if (editorPartType == shapeType)
                    {
                        displayTypes = new[] { "_" + ctx.Shape.Metadata.DisplayType };
                    }
                    else
                    {
                        displayTypes = new[] { "", "_" + ctx.Shape.Metadata.DisplayType };

                        // [ShapeType]_[DisplayType], e.g. HtmlBodyPart.Summary, BagPart.Summary, ListPartFeed.Summary
                        ctx.Shape.Metadata.Alternates.Add($"{shapeType}_{ctx.Shape.Metadata.DisplayType}");
                    }

                    if (shapeType == partType || shapeType == editorPartType)
                    {
                        foreach (var displayType in displayTypes)
                        {
                            // [ContentType]_[DisplayType]__[PartType], e.g. Blog-HtmlBodyPart, LandingPage-BagPart
                            ctx.Shape.Metadata.Alternates.Add($"{contentType}{displayType}__{partType}");

                            if (!String.IsNullOrEmpty(stereotype))
                            {
                                // [Stereotype]__[DisplayType]__[PartType], e.g. Widget-ContentsMetadata
                                ctx.Shape.Metadata.Alternates.Add($"{stereotype}{displayType}__{partType}");
                            }
                        }

                        if (partType != partName)
                        {
                            foreach (var displayType in displayTypes)
                            {
                                // [ContentType]_[DisplayType]__[PartName], e.g. LandingPage-Services
                                ctx.Shape.Metadata.Alternates.Add($"{contentType}{displayType}__{partName}");

                                if (!String.IsNullOrEmpty(stereotype))
                                {
                                    // [Stereotype]_[DisplayType]__[PartName], e.g. LandingPage-Services
                                    ctx.Shape.Metadata.Alternates.Add($"{stereotype}{displayType}__{partName}");
                                }
                            }
                        }
                    }
                    else
                    {
                        if (hasDisplayMode)
                        {
                            // [PartType]_[DisplayType]__[DisplayMode]_Display, e.g. HtmlBodyPart-MyDisplayMode.Display.Summary
                            ctx.Shape.Metadata.Alternates.Add($"{partType}_{ctx.Shape.Metadata.DisplayType}__{displayMode}{DisplayToken}");
                        }

                        var lastAlternatesOfNamedPart = new List<string>();

                        for (var i = 0; i < displayTypes.Length; i++)
                        {
                            var displayType = displayTypes[i];

                            if (hasDisplayMode)
                            {
                                shapeType = $"{partType}__{displayMode}";

                                if (displayType == "")
                                {
                                    displayType = DisplayToken;
                                }
                                else
                                {
                                    shapeType += DisplayToken;
                                }
                            }

                            // [ContentType]_[DisplayType]__[PartType]__[ShapeType], e.g. Blog-ListPart-ListPartFeed
                            ctx.Shape.Metadata.Alternates.Add($"{contentType}{displayType}__{partType}__{shapeType}");

                            if (!String.IsNullOrEmpty(stereotype))
                            {
                                // [Stereotype]_[DisplayType]__[PartType]__[ShapeType], e.g. Blog-ListPart-ListPartFeed
                                ctx.Shape.Metadata.Alternates.Add($"{stereotype}{displayType}__{partType}__{shapeType}");
                            }

                            if (partType != partName)
                            {
                                // [ContentType]_[DisplayType]__[PartName]__[ShapeType], e.g. LandingPage-Services-BagPartSummary
                                lastAlternatesOfNamedPart.Add($"{contentType}{displayType}__{partName}__{shapeType}");

                                if (!String.IsNullOrEmpty(stereotype))
                                {
                                    // [Stereotype]_[DisplayType]__[PartName]__[ShapeType], e.g. LandingPage-Services-BagPartSummary
                                    lastAlternatesOfNamedPart.Add($"{stereotype}{displayType}__{partName}__{shapeType}");
                                }
                            }
                        }

                        ctx.Shape.Metadata.Alternates.AddRange(lastAlternatesOfNamedPart);
                    }
                });
            }

            return result;
        }