2010-07-26 02:50:23 +08:00
using System.Collections.Generic ;
using System.Linq ;
using System.Text.RegularExpressions ;
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-07-26 02:50:23 +08:00
using Orchard.Core.Common.Services ;
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-06-30 06:07:40 +08:00
// \/\/ Hackalicious on many accounts - don't copy what has been done here for the wrapper \/\/
2010-07-23 03:52:16 +08:00
protected override DriverResult Display ( BodyPart part , string displayType ) {
2010-07-26 02:50:23 +08:00
var bodyText = _htmlFilters . Aggregate ( part . Text , ( text , filter ) = > filter . ProcessContent ( text ) ) ;
2010-09-04 07:04:42 +08:00
var model = new BodyDisplayViewModel { BodyPart = part , Html = new HtmlString ( bodyText ) } ;
2010-07-22 12:19:04 +08:00
var location = part . GetLocation ( displayType ) ;
2010-03-03 19:32:01 +08:00
2010-03-03 06:07:58 +08:00
return Combined (
2010-07-22 08:17:13 +08:00
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 ) ;
2010-01-06 04:58:50 +08:00
}
2010-07-26 02:50:23 +08:00
2010-07-23 03:52:16 +08:00
protected override DriverResult Editor ( BodyPart part ) {
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-07-23 03:52:16 +08:00
protected override DriverResult Editor ( BodyPart part , IUpdateModel updater ) {
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
}