2010-04-08 04:40:16 +08:00
using System.Text.RegularExpressions ;
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-01-06 04:58:50 +08:00
2010-03-04 15:31:42 +08:00
namespace Orchard.Core.Common.Drivers {
[UsedImplicitly]
2010-03-03 06:07:58 +08:00
public class BodyDriver : ContentPartDriver < BodyAspect > {
public IOrchardServices Services { get ; set ; }
2010-01-06 04:58:50 +08:00
private const string TemplateName = "Parts/Common.Body" ;
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
public BodyDriver ( IOrchardServices services ) {
Services = services ;
}
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-01-06 04:58:50 +08:00
protected override DriverResult Display ( BodyAspect part , string displayType ) {
2010-03-03 19:32:01 +08:00
var model = new BodyDisplayViewModel { BodyAspect = part , Text = BbcodeReplace ( part . Text ) } ;
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-03-06 17:25:17 +08:00
2010-01-06 04:58:50 +08:00
protected override DriverResult Editor ( BodyAspect 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-03-03 06:07:58 +08:00
protected override DriverResult Editor ( BodyAspect 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-03-06 17:25:17 +08:00
private static BodyEditorViewModel BuildEditorViewModel ( BodyAspect part ) {
return new BodyEditorViewModel {
BodyAspect = part ,
2010-06-30 06:07:40 +08:00
TextEditorTemplate = GetFlavor ( part ) = = "html" ? DefaultTextEditorTemplate : PlainTextEditorTemplate ,
2010-03-06 17:25:17 +08:00
AddMediaPath = new PathBuilder ( part ) . AddContentType ( ) . AddContainerSlug ( ) . AddSlug ( ) . ToString ( )
} ;
}
2010-06-30 06:07:40 +08:00
private static string GetFlavor ( BodyAspect part ) {
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 ( ) {
var common = _content . As < ICommonAspect > ( ) ;
if ( common = = null )
return this ;
2010-07-13 17:52:02 +08:00
var routable = common . Container . As < IsRoutable > ( ) ;
2010-03-06 17:25:17 +08:00
if ( routable = = null )
return this ;
Add ( routable . Slug ) ;
return this ;
}
public PathBuilder AddSlug ( ) {
2010-07-13 17:52:02 +08:00
var routable = _content . As < IsRoutable > ( ) ;
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
// Can be moved somewhere else once we have IoC enabled body text filters.
private static string BbcodeReplace ( string bodyText ) {
2010-05-20 01:29:55 +08:00
if ( string . IsNullOrEmpty ( bodyText ) )
return string . Empty ;
2010-03-03 06:51:08 +08:00
Regex urlRegex = new Regex ( @"\[url\]([^\]]+)\[\/url\]" ) ;
Regex urlRegexWithLink = new Regex ( @"\[url=([^\]]+)\]([^\]]+)\[\/url\]" ) ;
Regex imgRegex = new Regex ( @"\[img\]([^\]]+)\[\/img\]" ) ;
bodyText = urlRegex . Replace ( bodyText , "<a href=\"$1\">$1</a>" ) ;
bodyText = urlRegexWithLink . Replace ( bodyText , "<a href=\"$1\">$2</a>" ) ;
bodyText = imgRegex . Replace ( bodyText , "<img src=\"$1\" />" ) ;
return bodyText ;
}
2010-01-06 04:58:50 +08:00
}
2010-03-04 15:31:42 +08:00
}