Adding LayoutPart summary shape.

This commit is contained in:
Sipke Schoorstra 2014-11-13 16:37:21 -08:00
parent a91d06a4b9
commit fbac586231
17 changed files with 158 additions and 13 deletions

View File

@ -1,6 +1,7 @@
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
namespace Orchard.Layouts.Drivers {
@ -25,5 +26,9 @@ namespace Orchard.Layouts.Drivers {
.Add("body", element.Content).RemoveTags().Analyze()
.Add("format", "html").Store();
}
protected override void OnBuildDocument(Html element, BuildElementDocumentContext context) {
context.HtmlContent = element.Content;
}
}
}

View File

@ -6,6 +6,7 @@ using Orchard.ContentManagement.Handlers;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Framework.Serialization;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Models;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
@ -15,20 +16,31 @@ namespace Orchard.Layouts.Drivers {
private readonly ILayoutSerializer _serializer;
private readonly IElementDisplay _elementDisplay;
private readonly IElementManager _elementManager;
private readonly ILayoutManager _layoutManager;
public LayoutPartDriver(
ILayoutSerializer serializer,
IElementDisplay elementDisplay,
IElementManager elementManager,
ILayoutManager layoutManager) {
public LayoutPartDriver(ILayoutSerializer serializer, IElementDisplay elementDisplay, IElementManager elementManager) {
_serializer = serializer;
_elementDisplay = elementDisplay;
_elementManager = elementManager;
_layoutManager = layoutManager;
}
protected override DriverResult Display(LayoutPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Layout", () => {
var describeContext = new DescribeElementsContext { Content = part };
var instances = _serializer.Deserialize(part.LayoutState, describeContext);
var layoutRoot = _elementDisplay.DisplayElements(instances, part, displayType: displayType);
return shapeHelper.Parts_Layout(LayoutRoot: layoutRoot);
});
return Combined(
ContentShape("Parts_Layout", () => {
var elements = _layoutManager.LoadElements(part);
var layoutRoot = _elementDisplay.DisplayElements(elements, part, displayType: displayType);
return shapeHelper.Parts_Layout(LayoutRoot: layoutRoot);
}),
ContentShape("Parts_Layout_Summary", () => {
var document = _layoutManager.BuildDocument(part);
return shapeHelper.Parts_Layout_Summary(Document: document);
}));
}
protected override DriverResult Editor(LayoutPart part, dynamic shapeHelper) {

View File

@ -2,6 +2,7 @@
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using MarkdownElement = Orchard.Layouts.Elements.Markdown;
@ -24,7 +25,7 @@ namespace Orchard.Layouts.Drivers {
}
protected override void OnDisplaying(MarkdownElement element, ElementDisplayContext context) {
context.ElementShape.ProcessedContent = new MarkdownSharp.Markdown().Transform(element.Content);
context.ElementShape.ProcessedContent = ToHtml(element.Content);
}
protected override void OnIndexing(MarkdownElement element, ElementIndexingContext context) {
@ -32,5 +33,13 @@ namespace Orchard.Layouts.Drivers {
.Add("body", element.Content).RemoveTags().Analyze()
.Add("format", "markdown").Store();
}
protected override void OnBuildDocument(MarkdownElement element, BuildElementDocumentContext context) {
context.HtmlContent = ToHtml(element.Content);
}
private string ToHtml(string markdown) {
return new MarkdownSharp.Markdown().Transform(markdown);
}
}
}

View File

@ -1,6 +1,7 @@
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
namespace Orchard.Layouts.Drivers {
@ -25,5 +26,9 @@ namespace Orchard.Layouts.Drivers {
.Add("body", element.Content).RemoveTags().Analyze()
.Add("format", "text").Store();
}
protected override void OnBuildDocument(Paragraph element, BuildElementDocumentContext context) {
context.HtmlContent = element.Content;
}
}
}

View File

@ -6,6 +6,7 @@ using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Models;
using Orchard.Layouts.Services;
using Orchard.Layouts.Settings;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
@ -40,7 +41,7 @@ namespace Orchard.Layouts.Drivers {
var text = element.Content;
var layoutPart = context.Content.As<LayoutPart>();
var flavor = GetFlavor(layoutPart);
var processedText = _htmlFilters.Aggregate(text, (t, filter) => filter.ProcessContent(t, flavor));
var processedText = ToHtml(text, flavor);
context.ElementShape.ProcessedText = processedText;
}
@ -54,6 +55,17 @@ namespace Orchard.Layouts.Drivers {
.Add("format", flavor).Store();
}
protected override void OnBuildDocument(Text element, BuildElementDocumentContext context) {
var layoutPart = context.Layout.As<LayoutPart>();
var flavor = GetFlavor(layoutPart);
context.HtmlContent = ToHtml(element.Content, flavor);
}
private string ToHtml(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
}
private static string GetFlavor(LayoutPart part) {
return part != null ? part.GetFlavor() : LayoutPartSettings.FlavorDefaultDefault; // TODO: make this configurable.
}

View File

@ -2,6 +2,7 @@ using System;
using System.Linq;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
namespace Orchard.Layouts.Framework.Drivers {
public abstract class ElementDriver<TElement> : Component, IElementDriver where TElement: IElement {
@ -33,6 +34,10 @@ namespace Orchard.Layouts.Framework.Drivers {
OnIndexing((TElement)context.Element, context);
}
public void BuildDocument(BuildElementDocumentContext context) {
OnBuildDocument((TElement)context.Element, context);
}
protected virtual EditorResult OnBuildEditor(TElement element, ElementEditorContext context) {
return null;
}
@ -53,6 +58,9 @@ namespace Orchard.Layouts.Framework.Drivers {
protected virtual void OnIndexing(TElement element, ElementIndexingContext context) {
}
protected virtual void OnBuildDocument(TElement element, BuildElementDocumentContext context) {
}
protected EditorResult Editor(ElementEditorContext context, params dynamic[] editorShapes) {
foreach (var editorShape in editorShapes) {
if (String.IsNullOrWhiteSpace(editorShape.Metadata.Position)) {

View File

@ -1,5 +1,6 @@
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Services;
namespace Orchard.Layouts.Framework.Drivers {
public interface IElementDriver : IDependency {
@ -10,5 +11,6 @@ namespace Orchard.Layouts.Framework.Drivers {
void LayoutSaving(ElementSavingContext context);
void Removing(ElementRemovingContext context);
void Indexing(ElementIndexingContext context);
void BuildDocument(BuildElementDocumentContext context);
}
}

View File

@ -231,13 +231,16 @@
<Compile Include="Helpers\EditorResultExtensions.cs" />
<Compile Include="Helpers\PrefixHelper.cs" />
<Compile Include="Providers\BlueprintElementHarvester.cs" />
<Compile Include="Services\BuildElementDocumentContext.cs" />
<Compile Include="Services\CurrentControllerAccessor.cs" />
<Compile Include="Services\ElementCreatedContext.cs" />
<Compile Include="Services\ElementCreatingContext.cs" />
<Compile Include="Services\ElementDocument.cs" />
<Compile Include="Services\ElementEventContext.cs" />
<Compile Include="Services\ElementEventHandlerBase.cs" />
<Compile Include="Services\ICurrentControllerAccessor.cs" />
<Compile Include="Services\IElementEventHandler.cs" />
<Compile Include="Services\LayoutDocument.cs" />
<Compile Include="Signals.cs" />
<Compile Include="ViewModels\ElementBlueprintPropertiesViewModel.cs" />
<Compile Include="ViewModels\CreateElementBlueprintViewModel.cs" />
@ -379,6 +382,9 @@
<ItemGroup>
<Content Include="Views\Element-Media-VectorImage.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Parts.Layout.Summary.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@ -8,6 +8,10 @@
<Place Parts_ElementWrapper="Content:3" />
</Match>
<Match DisplayType="Summary">
<Place Parts_Layout_Summary="Content:5"/>
</Match>
<Match DisplayType="Layout">
<Place Parts_Common_Body="Content:0"
Parts_Common_Body_Summary="-"

View File

@ -0,0 +1,10 @@
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Models;
namespace Orchard.Layouts.Services {
public class BuildElementDocumentContext {
public IElement Element { get; set; }
public string HtmlContent { get; set; }
public ILayoutAspect Layout { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using Orchard.Layouts.Framework.Elements;
namespace Orchard.Layouts.Services {
/// <summary>
/// Represents a layout document node.
/// </summary>
public class ElementDocument {
public IElement Element { get; set; }
public string Content { get; set; }
}
}

View File

@ -6,6 +6,7 @@ using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Framework.Harvesters;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Models;
namespace Orchard.Layouts.Services {
public class ElementManager : Component, IElementManager {
@ -21,9 +22,9 @@ namespace Orchard.Layouts.Services {
Lazy<IEnumerable<IElementHarvester>> elementHarvesters,
ICacheManager cacheManager,
Lazy<IEnumerable<IElementDriver>> drivers,
Lazy<IEnumerable<ICategoryProvider>> categoryProviders,
IElementFactory factory,
ISignals signals,
Lazy<IEnumerable<ICategoryProvider>> categoryProviders,
IElementFactory factory,
ISignals signals,
IElementEventHandler elementEventHandler) {
_elementHarvesters = elementHarvesters;
@ -151,12 +152,32 @@ namespace Orchard.Layouts.Services {
}
public void Indexing(LayoutIndexingContext context) {
var elementInstances = context.Elements.Flatten();
var elementInstances = context.Elements.Flatten();
InvokeDriver(elementInstances, (driver, elementInstance) => driver.Indexing(new ElementIndexingContext(context) {
Element = elementInstance
}));
}
public LayoutDocument BuildDocument(ILayoutAspect layout, IEnumerable<IElement> elements) {
var document = new LayoutDocument();
InvokeDriver(elements, (driver, element) => {
var context = new BuildElementDocumentContext {
Layout = layout,
Element = element
};
driver.BuildDocument(context);
if (!String.IsNullOrWhiteSpace(context.HtmlContent))
document.Elements.Add(new ElementDocument {
Element = element,
Content = context.HtmlContent
});
});
return document;
}
private IDictionary<string, Category> GetCategories() {
var providers = _categoryProviders.Value;
var categories = providers.SelectMany(x => x.GetCategories());

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Models;
namespace Orchard.Layouts.Services {
public interface IElementManager : IDependency {
@ -23,5 +24,6 @@ namespace Orchard.Layouts.Services {
void Saving(LayoutSavingContext context);
void Removing(LayoutSavingContext context);
void Indexing(LayoutIndexingContext context);
LayoutDocument BuildDocument(ILayoutAspect layout, IEnumerable<IElement> elements);
}
}

View File

@ -8,6 +8,7 @@ namespace Orchard.Layouts.Services {
IEnumerable<LayoutPart> GetTemplates();
LayoutPart GetLayout(int id);
IEnumerable<IElement> LoadElements(ILayoutAspect layout);
LayoutDocument BuildDocument(ILayoutAspect layout);
dynamic RenderLayout(ILayoutAspect layout, string state = null, string displayType = null);
/// <summary>

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Orchard.Layouts.Services {
/// <summary>
/// Represents a text document of a layout.
/// </summary>
public class LayoutDocument {
public LayoutDocument() {
Elements = new List<ElementDocument>();
}
public IList<ElementDocument> Elements { get; set; }
public string ToString(string separator) {
return String.Join(separator, Elements.Select(x => x.Content));
}
}
}

View File

@ -44,6 +44,11 @@ namespace Orchard.Layouts.Services {
return _serializer.Deserialize(layout.LayoutState, describeContext);
}
public LayoutDocument BuildDocument(ILayoutAspect layout) {
var elements = LoadElements(layout).Flatten().ToArray();
return _elementManager.BuildDocument(layout, elements);
}
public dynamic RenderLayout(ILayoutAspect layout, string state = null, string displayType = null) {
var elements = _serializer.Deserialize(state ?? layout.LayoutState, new DescribeElementsContext { Content = layout });
var layoutRoot = _elementDisplay.DisplayElements(elements, layout, displayType);

View File

@ -0,0 +1,13 @@
@*doing excerpt generation on the way out for now so we don't stick ourselves with needing to regen excerpts for existing data
also, doing this here, inline, until we have a pluggable processing model (both in and out)
also, ...this is ugly *@
@using Orchard.ContentManagement
@using Orchard.Layouts.Services
@using Orchard.Utility.Extensions
@{
var contentItem = (ContentItem)Model.ContentItem;
var document = (LayoutDocument)Model.Document;
var documentText = document.ToString(separator: Environment.NewLine).RemoveTags();
var excerpt = new HtmlString(Html.Excerpt(documentText, 200).ToString().Replace(Environment.NewLine, "</p>" + Environment.NewLine + "<p>"));
}
<p>@excerpt @Html.ItemDisplayLink(T("more").ToString(), contentItem)</p>