diff --git a/src/Orchard.Tests.Modules/Autoroute/DefaultSlugServiceTests.cs b/src/Orchard.Tests.Modules/Autoroute/DefaultSlugServiceTests.cs index 7bb04817b..ea15a91c3 100644 --- a/src/Orchard.Tests.Modules/Autoroute/DefaultSlugServiceTests.cs +++ b/src/Orchard.Tests.Modules/Autoroute/DefaultSlugServiceTests.cs @@ -1,54 +1,46 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Moq; +using Moq; using NUnit.Framework; using Orchard.Autoroute.Services; namespace Orchard.Tests.Modules.Autoroute { [TestFixture] public class DefaultSlugServiceTests { + + private DefaultSlugService _slugService = new DefaultSlugService(new Mock().Object); + [Test] public void ShouldStripContiguousDashes() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); - - Assert.That(slugService.Slugify("a - b"), Is.EqualTo("a-b")); + Assert.That(_slugService.Slugify("a - b"), Is.EqualTo("a-b")); } [Test] public void ShouldStripContiguousDashes2() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); - - Assert.That(slugService.Slugify("a - - - - - -b"), Is.EqualTo("a-b")); + Assert.That(_slugService.Slugify("a - - - - - -b"), Is.EqualTo("a-b")); } [Test] public void ShouldStripContiguousDashesEverywhere() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); - - Assert.That(slugService.Slugify("a - b - c -- d"), Is.EqualTo("a-b-c-d")); + Assert.That(_slugService.Slugify("a - b - c -- d"), Is.EqualTo("a-b-c-d")); } [Test] public void ShouldChangePercentSymbolsToHyphans() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); - - Assert.That(slugService.Slugify("a%d"), Is.EqualTo("a-d")); + Assert.That(_slugService.Slugify("a%d"), Is.EqualTo("a-d")); } [Test] public void ShouldChangeDotSymbolsToHyphans() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); - - Assert.That(slugService.Slugify("a,d"), Is.EqualTo("a-d")); + Assert.That(_slugService.Slugify("a,d"), Is.EqualTo("a-d")); } [Test] public void ShouldMakeSureFunkycharactersAndHyphansOnlyReturnSingleHyphan() { - DefaultSlugService slugService = new DefaultSlugService(new Mock().Object); + Assert.That(_slugService.Slugify("a-%-.d"), Is.EqualTo("a-d")); + } - Assert.That(slugService.Slugify("a-%-.d"), Is.EqualTo("a-d")); + [Test] + public void ShouldPreserveCyrilicCharacters() { + Assert.That(_slugService.Slugify("джинсы_клеш"), Is.EqualTo("джинсы_клеш")); } } } diff --git a/src/Orchard.Tests.Modules/ImageProcessing/ImageProcessingTests.cs b/src/Orchard.Tests.Modules/ImageProcessing/ImageProcessingTests.cs new file mode 100644 index 000000000..2b4d89d2f --- /dev/null +++ b/src/Orchard.Tests.Modules/ImageProcessing/ImageProcessingTests.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using Moq; +using NUnit.Framework; +using Orchard.MediaProcessing.Services; + +namespace Orchard.Tests.Modules.ImageProcessing { + [TestFixture] + public class ImageProcessingTests { + + private readonly MethodInfo _createDefaultFilename = typeof(ImageProfileManager).GetMethod("CreateDefaultFileName", BindingFlags.NonPublic | BindingFlags.Static); + + private string CreateDefaultFileName(string path) { + return (string)_createDefaultFilename.Invoke(null, new object[] {path}); + } + + [Test] + public void CreateDefaultFilenameRemovesInvalidChars() { + Assert.That(CreateDefaultFileName("abcdef"), Is.EqualTo("abcdef")); + Assert.That(CreateDefaultFileName("abc_def"), Is.EqualTo("abc_def")); + } + + [Test] + public void CreateDefaultFilenamePeservesInternationalLetters() { + Assert.That(CreateDefaultFileName("aéçâê"), Is.EqualTo("aecae")); + Assert.That(CreateDefaultFileName("джинсы_клеш"), Is.EqualTo("джинсы_клеш")); + } + } +} diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj index 568e040f4..5e96f7fd1 100644 --- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj +++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj @@ -141,6 +141,7 @@ + @@ -218,6 +219,10 @@ {EA2B9121-EF54-40A6-A53E-6593C86EE696} Orchard.Indexing + + {08191FCD-7258-4F19-95FB-AEC3DE77B2EB} + Orchard.MediaProcessing + {D9A7B330-CD22-4DA1-A95A-8DE1982AD8EB} Orchard.Media diff --git a/src/Orchard.Web/Modules/Orchard.MediaProcessing/Services/ImageProfileManager.cs b/src/Orchard.Web/Modules/Orchard.MediaProcessing/Services/ImageProfileManager.cs index 2d40d8cd3..7532f6963 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaProcessing/Services/ImageProfileManager.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaProcessing/Services/ImageProfileManager.cs @@ -197,11 +197,20 @@ namespace Orchard.MediaProcessing.Services { return false; } + private static readonly char[] _disallowed = @"/:?#\[\]@!$&'()*+,.;=\s\""\<\>\\\|%".ToCharArray(); + private static string CreateDefaultFileName(string path) { var extention = Path.GetExtension(path); var newPath = Path.ChangeExtension(path, ""); - newPath = newPath.Replace(@"/", "_"); - return newPath.ToSafeName() + extention; + newPath = newPath.TrimEnd('.').RemoveDiacritics(); + var normalized = newPath.ToCharArray(); + for (var i = 0; i < normalized.Length; i++) { + if (Array.IndexOf(_disallowed, normalized[i]) >= 0) { + normalized[i] = '_'; + } + } + + return new string(normalized) + extention; } } } diff --git a/src/Orchard/Utility/Extensions/StringExtensions.cs b/src/Orchard/Utility/Extensions/StringExtensions.cs index 9c0a26e98..36239191c 100644 --- a/src/Orchard/Utility/Extensions/StringExtensions.cs +++ b/src/Orchard/Utility/Extensions/StringExtensions.cs @@ -196,7 +196,7 @@ namespace Orchard.Utility.Extensions { return (c == '\r' || c == '\n' || c == '\t' || c == '\f' || c == ' '); } - public static string RemoveDiacritics(string name) { + public static string RemoveDiacritics(this string name) { string stFormD = name.Normalize(NormalizationForm.FormD); var sb = new StringBuilder();