From a91d06a4b95d9e5d6ada1430662d620eca27be3f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 13 Nov 2014 15:13:39 -0800 Subject: [PATCH] Adding support for layout element indexing. --- .../Orchard.Layouts/Drivers/HtmlDriver.cs | 7 +++++++ .../Orchard.Layouts/Drivers/MarkdownDriver.cs | 7 +++++++ .../Drivers/ParagraphDriver.cs | 7 +++++++ .../Orchard.Layouts/Drivers/TextDriver.cs | 18 ++++++++++++++-- .../Framework/Drivers/ElementDriver.cs | 13 +++++++++--- .../Framework/Drivers/IElementDriver.cs | 3 ++- .../Elements/ElementIndexingContext.cs | 10 +++++++++ .../Elements/LayoutIndexingContext.cs | 11 ++++++++++ .../Handlers/LayoutPartHandler.cs | 21 ++++++++++++++++++- .../Orchard.Layouts/Orchard.Layouts.csproj | 2 ++ .../Services/ElementManager.cs | 9 +++++++- .../Services/IElementManager.cs | 1 + 12 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementIndexingContext.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/LayoutIndexingContext.cs diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/HtmlDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/HtmlDriver.cs index da08fa039..e4c844063 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/HtmlDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/HtmlDriver.cs @@ -1,5 +1,6 @@ using Orchard.Layouts.Elements; using Orchard.Layouts.Framework.Drivers; +using Orchard.Layouts.Framework.Elements; using Orchard.Layouts.ViewModels; namespace Orchard.Layouts.Drivers { @@ -18,5 +19,11 @@ namespace Orchard.Layouts.Drivers { return Editor(context, editor); } + + protected override void OnIndexing(Html element, ElementIndexingContext context) { + context.DocumentIndex + .Add("body", element.Content).RemoveTags().Analyze() + .Add("format", "html").Store(); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/MarkdownDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/MarkdownDriver.cs index f4b9e83a7..36210c93d 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/MarkdownDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/MarkdownDriver.cs @@ -1,6 +1,7 @@ using Orchard.Environment.Extensions; using Orchard.Layouts.Framework.Display; using Orchard.Layouts.Framework.Drivers; +using Orchard.Layouts.Framework.Elements; using Orchard.Layouts.ViewModels; using MarkdownElement = Orchard.Layouts.Elements.Markdown; @@ -25,5 +26,11 @@ namespace Orchard.Layouts.Drivers { protected override void OnDisplaying(MarkdownElement element, ElementDisplayContext context) { context.ElementShape.ProcessedContent = new MarkdownSharp.Markdown().Transform(element.Content); } + + protected override void OnIndexing(MarkdownElement element, ElementIndexingContext context) { + context.DocumentIndex + .Add("body", element.Content).RemoveTags().Analyze() + .Add("format", "markdown").Store(); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ParagraphDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ParagraphDriver.cs index 133bc1ec4..0fe6f7b6f 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ParagraphDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/ParagraphDriver.cs @@ -1,5 +1,6 @@ using Orchard.Layouts.Elements; using Orchard.Layouts.Framework.Drivers; +using Orchard.Layouts.Framework.Elements; using Orchard.Layouts.ViewModels; namespace Orchard.Layouts.Drivers { @@ -18,5 +19,11 @@ namespace Orchard.Layouts.Drivers { return Editor(context, editor); } + + protected override void OnIndexing(Paragraph element, ElementIndexingContext context) { + context.DocumentIndex + .Add("body", element.Content).RemoveTags().Analyze() + .Add("format", "text").Store(); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/TextDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/TextDriver.cs index 307dccfc8..dd3ce64df 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/TextDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/TextDriver.cs @@ -4,6 +4,7 @@ using Orchard.ContentManagement; using Orchard.Layouts.Elements; using Orchard.Layouts.Framework.Display; using Orchard.Layouts.Framework.Drivers; +using Orchard.Layouts.Framework.Elements; using Orchard.Layouts.Models; using Orchard.Layouts.Settings; using Orchard.Layouts.ViewModels; @@ -19,7 +20,7 @@ namespace Orchard.Layouts.Drivers { protected override EditorResult OnBuildEditor(Text element, ElementEditorContext context) { var content = context.Content; var layoutPart = content.As(); - var flavor = layoutPart != null ? layoutPart.GetFlavor() : LayoutPartSettings.FlavorDefaultDefault; // TODO: make this configurable. + var flavor = GetFlavor(layoutPart); var viewModel = new TextEditorViewModel { Flavor = flavor, @@ -38,10 +39,23 @@ namespace Orchard.Layouts.Drivers { protected override void OnDisplaying(Text element, ElementDisplayContext context) { var text = element.Content; var layoutPart = context.Content.As(); - var flavor = layoutPart != null ? layoutPart.GetFlavor() : LayoutPartSettings.FlavorDefaultDefault; // TODO: provide a different way to configure flavor, so that an ElementWrapperWidget can control this setting as well. + var flavor = GetFlavor(layoutPart); var processedText = _htmlFilters.Aggregate(text, (t, filter) => filter.ProcessContent(t, flavor)); context.ElementShape.ProcessedText = processedText; } + + protected override void OnIndexing(Text element, ElementIndexingContext context) { + var layoutPart = context.Layout.As(); + var flavor = GetFlavor(layoutPart); + + context.DocumentIndex + .Add("body", element.Content).RemoveTags().Analyze() + .Add("format", flavor).Store(); + } + + private static string GetFlavor(LayoutPart part) { + return part != null ? part.GetFlavor() : LayoutPartSettings.FlavorDefaultDefault; // TODO: make this configurable. + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ElementDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ElementDriver.cs index f8537c450..d5b1dc3b6 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/ElementDriver.cs @@ -25,8 +25,12 @@ namespace Orchard.Layouts.Framework.Drivers { OnLayoutSaving((TElement) context.Element, context); } - public void ElementRemoving(ElementRemovingContext context) { - OnElementRemoving((TElement) context.Element, context); + public void Removing(ElementRemovingContext context) { + OnRemoving((TElement) context.Element, context); + } + + public void Indexing(ElementIndexingContext context) { + OnIndexing((TElement)context.Element, context); } protected virtual EditorResult OnBuildEditor(TElement element, ElementEditorContext context) { @@ -43,7 +47,10 @@ namespace Orchard.Layouts.Framework.Drivers { protected virtual void OnLayoutSaving(TElement element, ElementSavingContext context) { } - protected virtual void OnElementRemoving(TElement element, ElementRemovingContext context) { + protected virtual void OnRemoving(TElement element, ElementRemovingContext context) { + } + + protected virtual void OnIndexing(TElement element, ElementIndexingContext context) { } protected EditorResult Editor(ElementEditorContext context, params dynamic[] editorShapes) { diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/IElementDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/IElementDriver.cs index e9e4446a8..b44db1521 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/IElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Drivers/IElementDriver.cs @@ -8,6 +8,7 @@ namespace Orchard.Layouts.Framework.Drivers { EditorResult UpdateEditor(ElementEditorContext context); void Displaying(ElementDisplayContext context); void LayoutSaving(ElementSavingContext context); - void ElementRemoving(ElementRemovingContext context); + void Removing(ElementRemovingContext context); + void Indexing(ElementIndexingContext context); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementIndexingContext.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementIndexingContext.cs new file mode 100644 index 000000000..225ecf6d9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementIndexingContext.cs @@ -0,0 +1,10 @@ +namespace Orchard.Layouts.Framework.Elements { + public class ElementIndexingContext : LayoutIndexingContext { + public ElementIndexingContext(LayoutIndexingContext stub) { + DocumentIndex = stub.DocumentIndex; + Layout = stub.Layout; + Elements = stub.Elements; + } + public IElement Element { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/LayoutIndexingContext.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/LayoutIndexingContext.cs new file mode 100644 index 000000000..fd9485746 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/LayoutIndexingContext.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Orchard.Indexing; +using Orchard.Layouts.Models; + +namespace Orchard.Layouts.Framework.Elements { + public class LayoutIndexingContext { + public ILayoutAspect Layout { get; set; } + public IEnumerable Elements { get; set; } + public IDocumentIndex DocumentIndex { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Handlers/LayoutPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Handlers/LayoutPartHandler.cs index 446042c5e..49b8ee541 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Handlers/LayoutPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Handlers/LayoutPartHandler.cs @@ -1,6 +1,8 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; using Orchard.Data; +using Orchard.Layouts.Framework.Elements; +using Orchard.Layouts.Helpers; using Orchard.Layouts.Models; using Orchard.Layouts.Services; @@ -8,12 +10,29 @@ namespace Orchard.Layouts.Handlers { public class LayoutPartHandler : ContentHandler { private readonly ILayoutManager _layoutManager; private readonly IContentManager _contentManager; + private readonly IElementManager _elementManager; + + public LayoutPartHandler( + IRepository repository, + ILayoutManager layoutManager, + IContentManager contentManager, + IElementManager elementManager) { - public LayoutPartHandler(IRepository repository, ILayoutManager layoutManager, IContentManager contentManager) { _layoutManager = layoutManager; _contentManager = contentManager; + _elementManager = elementManager; Filters.Add(StorageFilter.For(repository)); OnPublished(UpdateTemplateClients); + OnIndexing(IndexElements); + } + + private void IndexElements(IndexContentContext context, LayoutPart part) { + var elements = _layoutManager.LoadElements(part).Flatten(); + _elementManager.Indexing(new LayoutIndexingContext { + Layout = part, + Elements = elements, + DocumentIndex = context.DocumentIndex + }); } private void UpdateTemplateClients(PublishContentContext context, LayoutPart part) { diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj index 70f9f9b22..fbee5f5fe 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj @@ -224,6 +224,8 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs index e1b2dff20..6c07f63a9 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs @@ -145,7 +145,14 @@ namespace Orchard.Layouts.Services { public void Removing(LayoutSavingContext context) { var elementInstances = context.RemovedElements.Flatten(); - InvokeDriver(elementInstances, (driver, elementInstance) => driver.ElementRemoving(new ElementRemovingContext(context) { + InvokeDriver(elementInstances, (driver, elementInstance) => driver.Removing(new ElementRemovingContext(context) { + Element = elementInstance + })); + } + + public void Indexing(LayoutIndexingContext context) { + var elementInstances = context.Elements.Flatten(); + InvokeDriver(elementInstances, (driver, elementInstance) => driver.Indexing(new ElementIndexingContext(context) { Element = elementInstance })); } diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/IElementManager.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/IElementManager.cs index 70dca3961..2a57872fb 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/IElementManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/IElementManager.cs @@ -22,5 +22,6 @@ namespace Orchard.Layouts.Services { EditorResult UpdateEditor(ElementEditorContext context); void Saving(LayoutSavingContext context); void Removing(LayoutSavingContext context); + void Indexing(LayoutIndexingContext context); } } \ No newline at end of file