Changing the way we check for files for TinyMCE - should increase performance of loading the editor

This commit is contained in:
Nicholas Mayne
2014-08-30 16:08:50 +01:00
parent 690aa633b3
commit 8edd49244a
3 changed files with 74 additions and 21 deletions

View File

@@ -0,0 +1,70 @@
using System;
using System.Globalization;
using System.Linq;
using Orchard;
using Orchard.Caching;
using Orchard.DisplayManagement.Implementation;
using Orchard.FileSystems.VirtualPath;
namespace TinyMce.Services {
public class TinyMceShapeDisplayEvent : ShapeDisplayEvents {
private readonly ICacheManager _cacheManager;
private readonly ISignals _signals;
private readonly IVirtualPathProvider _virtualPathProvider;
private readonly IWorkContextAccessor _workContextAccessor;
private const string CacheKeyFormat = "tinymce-locales-{0}";
private const string DefaultLanguage = "en";
public TinyMceShapeDisplayEvent(
ICacheManager cacheManager,
IVirtualPathProvider virtualPathProvider,
IWorkContextAccessor workContextAccessor,
ISignals signals) {
_signals = signals;
_cacheManager = cacheManager;
_virtualPathProvider = virtualPathProvider;
_workContextAccessor = workContextAccessor;
}
public override void Displaying(ShapeDisplayingContext context) {
if (String.CompareOrdinal(context.ShapeMetadata.Type, "Body_Editor") != 0) {
return;
}
if (String.CompareOrdinal(context.Shape.EditorFlavor, "html") != 0) {
return;
}
context.Shape.Language = GetTinyMceLanguageIdentifier();
}
private string GetTinyMceLanguageIdentifier() {
var currentCulture = CultureInfo.GetCultureInfo(_workContextAccessor.GetContext().CurrentCulture);
if (currentCulture.Name.Equals(DefaultLanguage, StringComparison.OrdinalIgnoreCase))
return currentCulture.Name;
return _cacheManager.Get(string.Format(CacheKeyFormat, currentCulture.Name), ctx => {
ctx.Monitor(_signals.When("culturesChanged"));
var customLanguage = currentCulture.Name.Replace('-', '_');
var languageFiles = _virtualPathProvider
.ListFiles("~/modules/tinymce/scripts/langs")
.ToList();
if (languageFiles.Any(x => x == string.Format("{0}.js", customLanguage)))
return customLanguage;
if (!DefaultLanguage.Equals(currentCulture.TwoLetterISOLanguageName, StringComparison.OrdinalIgnoreCase) &&
languageFiles.Any(x => x == string.Format("{0}.js", currentCulture.TwoLetterISOLanguageName))) {
return currentCulture.TwoLetterISOLanguageName;
}
return DefaultLanguage;
});
}
}
}

View File

@@ -48,6 +48,7 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Web" />
@@ -181,6 +182,7 @@
<ItemGroup>
<Compile Include="ResourceManifest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\TinyMceShapeDisplayEvent.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Body-Html.Editor.cshtml" />

View File

@@ -1,35 +1,16 @@
@using System.Globalization
@using Orchard.ContentManagement
@using Orchard.ContentManagement
@using Orchard.Environment.Descriptor.Models
@using Orchard.FileSystems.VirtualPath
@using Orchard.Localization
@{
var shellDescriptor = WorkContext.Resolve<ShellDescriptor>();
var virtualPathProvider = WorkContext.Resolve<IVirtualPathProvider>();
// Default language for TinyMCE
var language = "en";
var currentCulture = CultureInfo.GetCultureInfo(WorkContext.CurrentCulture);
if (!currentCulture.Name.Equals("en-US", StringComparison.OrdinalIgnoreCase)) {
var customLanguage = currentCulture.Name.Replace('-', '_');
if (!language.Equals(customLanguage, StringComparison.OrdinalIgnoreCase)) {
if (virtualPathProvider.TryFileExists(string.Format(@"\modules\tinymce\scripts\langs\{0}.js", customLanguage))) {
language = customLanguage;
}
else if (!language.Equals(currentCulture.TwoLetterISOLanguageName, StringComparison.OrdinalIgnoreCase) &&
virtualPathProvider.TryFileExists(string.Format(@"\modules\tinymce\scripts\langs\{0}.js", currentCulture.TwoLetterISOLanguageName))) {
language = currentCulture.TwoLetterISOLanguageName;
}
}
}
}
<script type="text/javascript">
var mediaPickerEnabled = @(shellDescriptor.Features.Any(x => x.Name == "Orchard.MediaPicker") ? "true" : "false");
var mediaLibraryEnabled = @(shellDescriptor.Features.Any(x => x.Name == "Orchard.MediaLibrary") ? "true" : "false");
var directionality = '@WorkContext.GetTextDirection((IContent)Model.BodyPart.ContentItem)';
var language = '@language';
var language = '@Model.Language';
</script>
@{