mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-07-15 21:34:43 +08:00
Reverting comments filters changes
--HG-- branch : 1.x
This commit is contained in:
parent
6f7bc1b87a
commit
7d19c8de7a
@ -10,28 +10,28 @@ namespace Orchard.Core.Tests.Common {
|
||||
[Test]
|
||||
public void ShouldIgnoreText() {
|
||||
const string text = "foo bar baz";
|
||||
var processed = _filter.ProcessContent(text);
|
||||
var processed = _filter.ProcessContent(text, null);
|
||||
Assert.That(processed, Is.EqualTo(text));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldReplaceUrl() {
|
||||
const string text = "foo [url]bar[/url] baz";
|
||||
var processed = _filter.ProcessContent(text);
|
||||
var processed = _filter.ProcessContent(text, null);
|
||||
Assert.That(processed, Is.EqualTo("foo <a href=\"bar\">bar</a> baz"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldReplaceImg() {
|
||||
const string text = "foo [img]bar[/img] baz";
|
||||
var processed = _filter.ProcessContent(text);
|
||||
var processed = _filter.ProcessContent(text, null);
|
||||
Assert.That(processed, Is.EqualTo("foo <img src=\"bar\" /> baz"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldReplaceUrlWithTitle() {
|
||||
const string text = "foo [url=alink]bar[/url] baz";
|
||||
var processed = _filter.ProcessContent(text);
|
||||
var processed = _filter.ProcessContent(text, null);
|
||||
Assert.That(processed, Is.EqualTo("foo <a href=\"alink\">bar</a> baz"));
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using JetBrains.Annotations;
|
||||
@ -38,13 +37,12 @@ namespace Orchard.Core.Common.Drivers {
|
||||
return Combined(
|
||||
ContentShape("Parts_Common_Body",
|
||||
() => {
|
||||
var flavor = GetFlavor(part);
|
||||
var bodyText = _htmlFilters.Where(x => x.GetType().Name.Equals(flavor + "filter", StringComparison.OrdinalIgnoreCase)).Aggregate(part.Text, (text, filter) => filter.ProcessContent(text));
|
||||
var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part)));
|
||||
return shapeHelper.Parts_Common_Body(Html: new HtmlString(bodyText));
|
||||
}),
|
||||
ContentShape("Parts_Common_Body_Summary",
|
||||
() => {
|
||||
var bodyText = _htmlFilters.Where(x => x.GetType().Name.Equals(GetFlavor(part) + "filter", StringComparison.OrdinalIgnoreCase)).Aggregate(part.Text, (text, filter) => filter.ProcessContent(text));
|
||||
var bodyText = _htmlFilters.Aggregate(part.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(part)));
|
||||
return shapeHelper.Parts_Common_Body_Summary(Html: new HtmlString(bodyText));
|
||||
})
|
||||
);
|
||||
|
@ -39,7 +39,7 @@ namespace Orchard.Core.Common.Drivers {
|
||||
() => {
|
||||
var settings = field.PartFieldDefinition.Settings.GetModel<TextFieldSettings>();
|
||||
|
||||
object fieldValue = new HtmlString(_htmlFilters.Where(x => x.GetType().Name.Equals(settings.Flavor + "filter", StringComparison.OrdinalIgnoreCase)).Aggregate(field.Value, (text, filter) => filter.ProcessContent(text)));
|
||||
object fieldValue = new HtmlString(_htmlFilters.Aggregate(field.Value, (text, filter) => filter.ProcessContent(text, settings.Flavor)));
|
||||
return shapeHelper.Fields_Common_Text(Name: field.Name, Value: fieldValue);
|
||||
});
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ using Orchard.Services;
|
||||
|
||||
namespace Orchard.Core.Common.Services {
|
||||
public class BbcodeFilter : IHtmlFilter {
|
||||
public string ProcessContent(string text) {
|
||||
public string ProcessContent(string text, string flavor) {
|
||||
return BbcodeReplace(text);
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ namespace Orchard.Core.Feeds.StandardBuilders {
|
||||
public string Description {
|
||||
get {
|
||||
if (_body != null && !string.IsNullOrEmpty(_body.Text)) {
|
||||
return _htmlFilters.Where(x => x.GetType().Name.Equals(GetFlavor(_body) + "filter", StringComparison.OrdinalIgnoreCase)).Aggregate(_body.Text, (text, filter) => filter.ProcessContent(text));
|
||||
return _htmlFilters.Aggregate(_body.Text, (text, filter) => filter.ProcessContent(text, GetFlavor(_body)));
|
||||
}
|
||||
return Title;
|
||||
}
|
||||
|
@ -1,17 +1,17 @@
|
||||
using MarkdownSharp;
|
||||
using System;
|
||||
using Orchard.Services;
|
||||
|
||||
namespace Markdown.Services {
|
||||
public class MarkdownFilter : IHtmlFilter {
|
||||
public string ProcessContent(string text) {
|
||||
return MarkdownReplace(text);
|
||||
public string ProcessContent(string text, string flavor) {
|
||||
return flavor.Equals("markdown", StringComparison.OrdinalIgnoreCase) ? MarkdownReplace(text) : text;
|
||||
}
|
||||
|
||||
private static string MarkdownReplace(string text) {
|
||||
if (string.IsNullOrEmpty(text))
|
||||
return string.Empty;
|
||||
|
||||
var markdown = new MarkdownSharp.Markdown(new MarkdownOptions { AutoNewLines = false });
|
||||
var markdown = new MarkdownSharp.Markdown();
|
||||
return markdown.Transform(text);
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using JetBrains.Annotations;
|
||||
using Orchard.Comments.Models;
|
||||
using Orchard.Comments.Settings;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
using Orchard.ContentManagement.Aspects;
|
||||
using Orchard.Security;
|
||||
using Orchard.Services;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Comments.Services;
|
||||
@ -22,7 +18,6 @@ namespace Orchard.Comments.Drivers {
|
||||
private readonly IWorkContextAccessor _workContextAccessor;
|
||||
private readonly IClock _clock;
|
||||
private readonly ICommentService _commentService;
|
||||
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
|
||||
protected override string Prefix { get { return "Comments"; } }
|
||||
@ -34,28 +29,20 @@ namespace Orchard.Comments.Drivers {
|
||||
IWorkContextAccessor workContextAccessor,
|
||||
IClock clock,
|
||||
ICommentService commentService,
|
||||
IEnumerable<IHtmlFilter> htmlFilters,
|
||||
IOrchardServices orchardServices) {
|
||||
_contentManager = contentManager;
|
||||
_workContextAccessor = workContextAccessor;
|
||||
_clock = clock;
|
||||
_commentService = commentService;
|
||||
_htmlFilters = htmlFilters;
|
||||
_orchardServices = orchardServices;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
protected override DriverResult Display(CommentPart part, string displayType, dynamic shapeHelper) {
|
||||
var formattedText = new Lazy<string>(() => {
|
||||
var commentsPart = _contentManager.Get<CommentsPart>(part.CommentedOn);
|
||||
var settings = commentsPart.TypePartDefinition.Settings.GetModel<CommentsPartSettings>();
|
||||
var formatted = _htmlFilters.Where(x => x.GetType().Name.Equals(settings.HtmlFilter, StringComparison.OrdinalIgnoreCase)).Aggregate(part.CommentText, (text, filter) => filter.ProcessContent(text));
|
||||
return formatted;
|
||||
});
|
||||
|
||||
return Combined(
|
||||
ContentShape("Parts_Comment_SummaryAdmin", () => shapeHelper.Parts_Comment_SummaryAdmin(FormattedText: formattedText.Value))
|
||||
ContentShape("Parts_Comment", () => shapeHelper.Parts_Comment()),
|
||||
ContentShape("Parts_Comment_SummaryAdmin", () => shapeHelper.Parts_Comment_SummaryAdmin())
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -7,22 +7,18 @@ using Orchard.Comments.Settings;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Services;
|
||||
|
||||
namespace Orchard.Comments.Drivers {
|
||||
[UsedImplicitly]
|
||||
public class CommentsPartDriver : ContentPartDriver<CommentsPart> {
|
||||
private readonly ICommentService _commentService;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
|
||||
|
||||
public CommentsPartDriver(
|
||||
ICommentService commentService,
|
||||
IContentManager contentManager,
|
||||
IEnumerable<IHtmlFilter> htmlFilters) {
|
||||
IContentManager contentManager) {
|
||||
_commentService = commentService;
|
||||
_contentManager = contentManager;
|
||||
_htmlFilters = htmlFilters;
|
||||
}
|
||||
|
||||
protected override DriverResult Display(CommentsPart part, string displayType, dynamic shapeHelper) {
|
||||
@ -36,17 +32,13 @@ namespace Orchard.Comments.Drivers {
|
||||
return Combined(
|
||||
ContentShape("Parts_ListOfComments",
|
||||
() => {
|
||||
var settings = part.TypePartDefinition.Settings.GetModel<CommentsPartSettings>();
|
||||
|
||||
// create a hierarchy of shapes
|
||||
var firstLevelShapes = new List<dynamic>();
|
||||
var allShapes = new Dictionary<int, dynamic>();
|
||||
var comments = commentsForCommentedContent.Where(x => x.Status == CommentStatus.Approved).OrderBy(x => x.Position).List().ToList();
|
||||
|
||||
foreach (var item in comments) {
|
||||
var formatted = _htmlFilters.Where(x => x.GetType().Name.Equals(settings.HtmlFilter, StringComparison.OrdinalIgnoreCase)).Aggregate(item.CommentText, (text, filter) => filter.ProcessContent(text));
|
||||
var shape = shapeHelper.Parts_Comment(FormattedText: formatted, ContentPart: item, ContentItem: item.ContentItem);
|
||||
|
||||
var shape = shapeHelper.Parts_Comment(ContentPart: item, ContentItem: item.ContentItem);
|
||||
allShapes.Add(item.Id, shape);
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,6 @@
|
||||
<Compile Include="ResourceManifest.cs" />
|
||||
<Compile Include="Rules\CommentsActions.cs" />
|
||||
<Compile Include="Rules\CommentsForms.cs" />
|
||||
<Compile Include="Services\HtmlEncodeFilter.cs" />
|
||||
<Compile Include="Settings\CommentsPartSettings.cs" />
|
||||
<Compile Include="Settings\CommentsPartSettingsEvents.cs" />
|
||||
<Compile Include="Shapes.cs" />
|
||||
@ -99,7 +98,6 @@
|
||||
<Compile Include="Services\CommentService.cs" />
|
||||
<Compile Include="ViewModels\CommentsDetailsViewModel.cs" />
|
||||
<Compile Include="ViewModels\CommentsIndexViewModel.cs" />
|
||||
<Compile Include="ViewModels\CommentsPartSettingsViewModel.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Module.txt" />
|
||||
@ -159,12 +157,15 @@
|
||||
<ItemGroup>
|
||||
<Content Include="Views\EditorTemplates\Parts.Comment.AdminEdit.cshtml" />
|
||||
<Content Include="Views\CommentReplyButton.cshtml" />
|
||||
<Content Include="Views\DefinitionTemplates\CommentsPartSettingsViewModel.cshtml" />
|
||||
<Content Include="Views\DefinitionTemplates\CommentsPartSettings.cshtml" />
|
||||
<Content Include="Views\Parts.Comment.SummaryAdmin.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Parts.Comment.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\CommentText.cshtml" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
@ -1,12 +0,0 @@
|
||||
using System;
|
||||
using System.Web;
|
||||
using Orchard.Services;
|
||||
|
||||
namespace Orchard.Comments.Services {
|
||||
public class HtmlEncodeFilter : IHtmlFilter {
|
||||
public string ProcessContent(string text) {
|
||||
|
||||
return HttpUtility.HtmlEncode(Convert.ToString(text)).Replace("\r\n", "<br />\r\n");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +1,6 @@
|
||||
using Orchard.Comments.Services;
|
||||
|
||||
namespace Orchard.Comments.Settings {
|
||||
namespace Orchard.Comments.Settings {
|
||||
public class CommentsPartSettings {
|
||||
public CommentsPartSettings() {
|
||||
HtmlFilter = typeof (HtmlEncodeFilter).Name;
|
||||
}
|
||||
|
||||
public bool DefaultThreadedComments { get; set; }
|
||||
public bool MustBeAuthenticated { get; set; }
|
||||
public string HtmlFilter { get; set; }
|
||||
}
|
||||
}
|
@ -1,21 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Orchard.Comments.ViewModels;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
using Orchard.ContentManagement.MetaData.Builders;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
using Orchard.ContentManagement.ViewModels;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Services;
|
||||
|
||||
namespace Orchard.Comments.Settings {
|
||||
public class CommentsPartSettingsEvents : ContentDefinitionEditorEventsBase {
|
||||
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
|
||||
|
||||
public CommentsPartSettingsEvents(IEnumerable<IHtmlFilter> htmlFilters) {
|
||||
_htmlFilters = htmlFilters;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
|
||||
@ -23,29 +16,24 @@ namespace Orchard.Comments.Settings {
|
||||
if (definition.PartDefinition.Name != "CommentsPart")
|
||||
yield break;
|
||||
|
||||
var model = new CommentsPartSettingsViewModel {
|
||||
Settings = definition.Settings.GetModel<CommentsPartSettings>(),
|
||||
HtmlFilters = _htmlFilters
|
||||
};
|
||||
var settings = definition.Settings.GetModel<CommentsPartSettings>();
|
||||
|
||||
yield return DefinitionTemplate(model);
|
||||
yield return DefinitionTemplate(settings);
|
||||
}
|
||||
|
||||
public override IEnumerable<TemplateViewModel> TypePartEditorUpdate(ContentTypePartDefinitionBuilder builder, IUpdateModel updateModel) {
|
||||
if (builder.Name != "CommentsPart")
|
||||
yield break;
|
||||
|
||||
var model = new CommentsPartSettingsViewModel {
|
||||
Settings = new CommentsPartSettings()
|
||||
var settings = new CommentsPartSettings {
|
||||
};
|
||||
|
||||
if (updateModel.TryUpdateModel(model, "CommentsPartSettingsViewModel", null, null)) {
|
||||
builder.WithSetting("CommentsPartSettings.DefaultThreadedComments", model.Settings.DefaultThreadedComments.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("CommentsPartSettings.MustBeAuthenticated", model.Settings.MustBeAuthenticated.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("CommentsPartSettings.HtmlFilter", model.Settings.HtmlFilter);
|
||||
if (updateModel.TryUpdateModel(settings, "CommentsPartSettings", null, null)) {
|
||||
builder.WithSetting("CommentsPartSettings.DefaultThreadedComments", settings.DefaultThreadedComments.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("CommentsPartSettings.MustBeAuthenticated", settings.MustBeAuthenticated.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
yield return DefinitionTemplate(model);
|
||||
yield return DefinitionTemplate(settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.Comments.Settings;
|
||||
using Orchard.Services;
|
||||
|
||||
namespace Orchard.Comments.ViewModels {
|
||||
public class CommentsPartSettingsViewModel {
|
||||
public CommentsPartSettingsViewModel() {
|
||||
HtmlFilters = Enumerable.Empty<IHtmlFilter>();
|
||||
}
|
||||
|
||||
public CommentsPartSettings Settings { get; set; }
|
||||
public IEnumerable<IHtmlFilter> HtmlFilters { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
@using Orchard.Comments.Models
|
||||
@{
|
||||
CommentPart comment = Model.ContentPart;
|
||||
}
|
||||
|
||||
<p class="text">@(new MvcHtmlString(Html.Encode(comment.Record.CommentText).Replace("\r\n", "<br />\r\n")))</p>
|
@ -0,0 +1,13 @@
|
||||
@model Orchard.Comments.Settings.CommentsPartSettings
|
||||
|
||||
<fieldset>
|
||||
<div>
|
||||
@Html.EditorFor(m => m.DefaultThreadedComments)
|
||||
<label class="forcheckbox" for="@Html.FieldIdFor( m => m.DefaultThreadedComments)">@T("Use threaded comments by default")</label>
|
||||
</div>
|
||||
<div>
|
||||
@Html.EditorFor(m => m.MustBeAuthenticated)
|
||||
<label class="forcheckbox" for="@Html.FieldIdFor( m => m.MustBeAuthenticated)">@T("Users must be authenticated to comment")</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
@ -1,32 +0,0 @@
|
||||
@using Orchard.Utility.Extensions
|
||||
@model Orchard.Comments.ViewModels.CommentsPartSettingsViewModel
|
||||
|
||||
<fieldset>
|
||||
<div>
|
||||
<label for="@Html.FieldIdFor(m => m.Settings.HtmlFilter)" class="forcheckbox">@T("Comments formatting")</label>
|
||||
<select id="@Html.FieldIdFor(m => m.Settings.HtmlFilter)" name="@Html.FieldNameFor(m => m.Settings.HtmlFilter)">
|
||||
@Html.SelectOption("", String.IsNullOrWhiteSpace(Model.Settings.HtmlFilter), T("No formatting").ToString())
|
||||
@foreach(var htmlFilter in Model.HtmlFilters) {
|
||||
var htmlFilterName = htmlFilter.GetType().Name;
|
||||
@Html.SelectOption(htmlFilterName, htmlFilterName.Equals(Model.Settings.HtmlFilter, StringComparison.OrdinalIgnoreCase), htmlFilterName.CamelFriendly())
|
||||
}
|
||||
</select>
|
||||
|
||||
@Html.ValidationMessageFor(m => m.Settings.HtmlFilter)
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<div>
|
||||
@Html.EditorFor(m => m.Settings.DefaultThreadedComments)
|
||||
<label class="forcheckbox" for="@Html.FieldIdFor( m => m.Settings.DefaultThreadedComments)">@T("Use threaded comments by default")</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<div>
|
||||
@Html.EditorFor(m => m.Settings.MustBeAuthenticated)
|
||||
<label class="forcheckbox" for="@Html.FieldIdFor( m => m.Settings.MustBeAuthenticated)">@T("Users must be authenticated to comment")</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
@ -14,14 +14,14 @@
|
||||
<span class="who">@Display.CommentAuthor(ContentPart: comment)</span>
|
||||
<span class="when">@Display.CommentMetadata(ContentPart: comment)</span>
|
||||
@if (comments.ThreadedComments) {
|
||||
<span class="reply">@Display.CommentReplyButton(ContentPart: comment)</span>
|
||||
<span class="reply">@Display.CommentReplyButton(ContentPart: comment)</span>
|
||||
}
|
||||
</h4>
|
||||
</header>
|
||||
<p class="text">@Html.Raw(Convert.ToString(Model.FormattedText))</p>
|
||||
|
||||
@Display(children)
|
||||
|
||||
@Display.CommentText(ContentPart: Model.ContentPart, ContentItem: Model.ContentItem)
|
||||
|
||||
@Display(children)
|
||||
</article>
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
namespace Orchard.Services {
|
||||
public interface IHtmlFilter : IDependency {
|
||||
string ProcessContent(string text);
|
||||
string ProcessContent(string text, string flavor);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user