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;
}