2010-07-26 02:50:23 +08:00
using System.Collections.Generic ;
using System.Linq ;
2010-09-04 07:04:42 +08:00
using System.Web ;
2010-03-04 15:31:42 +08:00
using JetBrains.Annotations ;
2010-03-03 06:51:08 +08:00
using Orchard.ContentManagement ;
2010-03-06 17:25:17 +08:00
using Orchard.ContentManagement.Aspects ;
2010-03-03 06:07:58 +08:00
using Orchard.ContentManagement.Drivers ;
2010-01-06 04:58:50 +08:00
using Orchard.Core.Common.Models ;
2010-06-30 06:07:40 +08:00
using Orchard.Core.Common.Settings ;
2010-01-06 04:58:50 +08:00
using Orchard.Core.Common.ViewModels ;
2010-07-22 08:17:13 +08:00
using Orchard.Core.ContentsLocation.Models ;
2010-07-13 17:52:02 +08:00
using Orchard.Core.Routable.Models ;
2010-07-26 02:50:23 +08:00
using Orchard.Services ;
2010-01-06 04:58:50 +08:00
2010-03-04 15:31:42 +08:00
namespace Orchard.Core.Common.Drivers {
[UsedImplicitly]
2010-07-23 03:52:16 +08:00
public class BodyPartDriver : ContentPartDriver < BodyPart > {
2010-07-26 02:50:23 +08:00
private readonly IEnumerable < IHtmlFilter > _htmlFilters ;
2010-01-06 04:58:50 +08:00
private const string TemplateName = "Parts/Common.Body" ;
2010-09-01 02:50:07 +08:00
//todo: change back - or to something better
2010-09-15 05:21:35 +08:00
private const string DefaultTextEditorTemplate = "TinyMceTextEditor" ;
2010-06-30 06:07:40 +08:00
private const string PlainTextEditorTemplate = "PlainTextEditor" ;
2010-03-03 06:07:58 +08:00
2010-07-26 02:50:23 +08:00
public BodyPartDriver ( IOrchardServices services , IEnumerable < IHtmlFilter > htmlFilters ) {
_htmlFilters = htmlFilters ;
2010-03-03 06:07:58 +08:00
Services = services ;
}
2010-07-26 02:50:23 +08:00
public IOrchardServices Services { get ; set ; }
2010-01-06 04:58:50 +08:00
protected override string Prefix {
2010-03-06 17:25:17 +08:00
get { return "Body" ; }
2010-01-06 04:58:50 +08:00
}
2010-10-11 17:06:01 +08:00
protected override DriverResult Display ( BodyPart part , string displayType , dynamic shapeHelper ) {
2010-07-26 02:50:23 +08:00
var bodyText = _htmlFilters . Aggregate ( part . Text , ( text , filter ) = > filter . ProcessContent ( text ) ) ;
2010-10-12 00:45:29 +08:00
var body = shapeHelper . Parts_Common_Body ( ContentPart : part , Html : new HtmlString ( bodyText ) ) ;
2010-10-11 17:06:01 +08:00
if ( ! string . IsNullOrWhiteSpace ( displayType ) )
body . Metadata . Type = string . Format ( "{0}.{1}" , body . Metadata . Type , displayType ) ;
2010-07-22 12:19:04 +08:00
var location = part . GetLocation ( displayType ) ;
2010-03-03 19:32:01 +08:00
2010-10-11 17:06:01 +08:00
//return Combined(
// Services.Authorizer.Authorize(Permissions.ChangeOwner) ? ContentPartTemplate(model, "Parts/Common.Body.ManageWrapperPre").LongestMatch(displayType, "SummaryAdmin").Location(location) : null,
// Services.Authorizer.Authorize(Permissions.ChangeOwner) ? ContentPartTemplate(model, "Parts/Common.Body.Manage").LongestMatch(displayType, "SummaryAdmin").Location(location) : null,
// ContentPartTemplate(model, TemplateName, Prefix).LongestMatch(displayType, "Summary", "SummaryAdmin").Location(location),
// Services.Authorizer.Authorize(Permissions.ChangeOwner) ? ContentPartTemplate(model, "Parts/Common.Body.ManageWrapperPost").LongestMatch(displayType, "SummaryAdmin").Location(location) : null);
return ContentShape ( body ) . Location ( location ) ;
2010-01-06 04:58:50 +08:00
}
2010-07-26 02:50:23 +08:00
2010-10-11 17:06:01 +08:00
protected override DriverResult Editor ( BodyPart part , dynamic shapeHelper ) {
2010-03-06 17:25:17 +08:00
var model = BuildEditorViewModel ( part ) ;
2010-07-22 12:19:04 +08:00
var location = part . GetLocation ( "Editor" ) ;
2010-07-22 08:17:13 +08:00
return ContentPartTemplate ( model , TemplateName , Prefix ) . Location ( location ) ;
2010-01-06 04:58:50 +08:00
}
2010-10-11 17:06:01 +08:00
protected override DriverResult Editor ( BodyPart part , IUpdateModel updater , dynamic shapeHelper ) {
2010-03-06 17:25:17 +08:00
var model = BuildEditorViewModel ( part ) ;
2010-01-06 04:58:50 +08:00
updater . TryUpdateModel ( model , Prefix , null , null ) ;
2010-06-30 06:07:40 +08:00
// only set the format if it has not yet been set to preserve the initial format type - might want to change this later to support changing body formats but...later
if ( string . IsNullOrWhiteSpace ( model . Format ) )
model . Format = GetFlavor ( part ) ;
2010-07-22 12:19:04 +08:00
var location = part . GetLocation ( "Editor" ) ;
2010-07-22 08:17:13 +08:00
return ContentPartTemplate ( model , TemplateName , Prefix ) . Location ( location ) ;
2010-01-06 04:58:50 +08:00
}
2010-03-03 06:51:08 +08:00
2010-07-23 03:52:16 +08:00
private static BodyEditorViewModel BuildEditorViewModel ( BodyPart part ) {
2010-03-06 17:25:17 +08:00
return new BodyEditorViewModel {
2010-07-23 03:52:16 +08:00
BodyPart = part ,
2010-06-30 06:07:40 +08:00
TextEditorTemplate = GetFlavor ( part ) = = "html" ? DefaultTextEditorTemplate : PlainTextEditorTemplate ,
2010-07-26 02:50:23 +08:00
AddMediaPath = new PathBuilder ( part ) . AddContentType ( ) . AddContainerSlug ( ) . AddSlug ( ) . ToString ( )
2010-03-06 17:25:17 +08:00
} ;
}
2010-06-30 06:07:40 +08:00
2010-07-23 03:52:16 +08:00
private static string GetFlavor ( BodyPart part ) {
2010-06-30 06:07:40 +08:00
var typePartSettings = part . Settings . GetModel < BodyTypePartSettings > ( ) ;
return ( typePartSettings ! = null & & ! string . IsNullOrWhiteSpace ( typePartSettings . Flavor ) )
? typePartSettings . Flavor
: part . PartDefinition . Settings . GetModel < BodyPartSettings > ( ) . FlavorDefault ;
}
2010-03-06 17:25:17 +08:00
class PathBuilder {
private readonly IContent _content ;
private string _path ;
public PathBuilder ( IContent content ) {
_content = content ;
_path = "" ;
}
public override string ToString ( ) {
return _path ;
}
public PathBuilder AddContentType ( ) {
Add ( _content . ContentItem . ContentType ) ;
return this ;
}
public PathBuilder AddContainerSlug ( ) {
2010-07-23 03:52:16 +08:00
var common = _content . As < ICommonPart > ( ) ;
2010-03-06 17:25:17 +08:00
if ( common = = null )
return this ;
2010-07-23 16:01:49 +08:00
var routable = common . Container . As < RoutePart > ( ) ;
2010-03-06 17:25:17 +08:00
if ( routable = = null )
return this ;
Add ( routable . Slug ) ;
return this ;
}
public PathBuilder AddSlug ( ) {
2010-07-23 16:01:49 +08:00
var routable = _content . As < RoutePart > ( ) ;
2010-03-06 17:25:17 +08:00
if ( routable = = null )
return this ;
Add ( routable . Slug ) ;
return this ;
}
private void Add ( string segment ) {
if ( string . IsNullOrEmpty ( segment ) )
return ;
if ( string . IsNullOrEmpty ( _path ) )
_path = segment ;
else
_path = _path + "/" + segment ;
}
2010-03-03 06:51:08 +08:00
}
2010-01-06 04:58:50 +08:00
}
2010-03-04 15:31:42 +08:00
}