From d99d5a0b36ebbcbfb53077bcfce9c73a98901bef Mon Sep 17 00:00:00 2001 From: Patrick Scott Date: Thu, 3 Nov 2016 14:30:57 +0000 Subject: [PATCH 1/2] Issue U4-5572 convert file name to friendly media item name --- src/Umbraco.Core/StringExtensions.cs | 30 +++++++++++++++++++--- src/Umbraco.Web/Editors/MediaController.cs | 10 +------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 036b5b979f..02f2193e20 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -105,8 +105,8 @@ namespace Umbraco.Core //if the resolution was success, return it, otherwise just return the path, we've detected // it's a path but maybe it's relative and resolution has failed, etc... in which case we're just // returning what was given to us. - return resolvedUrlResult.Success - ? resolvedUrlResult + return resolvedUrlResult.Success + ? resolvedUrlResult : Attempt.Succeed(input); } } @@ -128,7 +128,7 @@ namespace Umbraco.Core } internal static readonly Regex Whitespace = new Regex(@"\s+", RegexOptions.Compiled); - internal static readonly string[] JsonEmpties = new [] { "[]", "{}" }; + internal static readonly string[] JsonEmpties = new[] { "[]", "{}" }; internal static bool DetectIsEmptyJson(this string input) { return JsonEmpties.Contains(Whitespace.Replace(input, string.Empty)); @@ -1470,5 +1470,29 @@ namespace Umbraco.Core byte[] hash = md5.ComputeHash(myStringBytes); return new Guid(hash); } + + + /// + /// Converts a file name to a friendly name for a content item + /// + /// + /// + public static string friendlyNameFromFilename(this string fileName) + { + // strip the file extension + fileName = StripFileExtension(fileName); + + // underscores and dashes to spaces + fileName = ReplaceMany(fileName, new char[] { '_', '-' }, ' '); + + // any other conversions ? + + // Pascalcase (to be done last) + fileName = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(fileName); + + + return fileName; + } + } } diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 08140f9c66..7f6c9f2580 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -534,15 +534,7 @@ namespace Umbraco.Web.Editors if (UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.Contains(ext)) mediaType = Constants.Conventions.MediaTypes.Image; - //TODO: make the media item name "nice" since file names could be pretty ugly, we have - // string extensions to do much of this but we'll need: - // * Pascalcase the name (use string extensions) - // * strip the file extension - // * underscores to spaces - // * probably remove 'ugly' characters - let's discuss - // All of this logic should exist in a string extensions method and be unit tested - // http://issues.umbraco.org/issue/U4-5572 - var mediaItemName = fileName; + var mediaItemName = fileName.friendlyNameFromFilename(); var f = mediaService.CreateMedia(mediaItemName, parentId, mediaType, Security.CurrentUser.Id); From e05a55c5329af18071c49c785471e8a5da3c0bdb Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Fri, 7 Sep 2018 15:20:29 +0200 Subject: [PATCH 2/2] Fixes incorrectly named method and removes extraneous spaces --- src/Umbraco.Core/StringExtensions.cs | 12 ++++++------ src/Umbraco.Web/Editors/MediaController.cs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 835b333813..c6b4da96eb 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -1574,29 +1574,29 @@ namespace Umbraco.Core guid[left] = guid[right]; guid[right] = temp; } - - + /// /// Converts a file name to a friendly name for a content item /// /// /// - public static string friendlyNameFromFilename(this string fileName) + public static string ToFriendlyName(this string fileName) { // strip the file extension - fileName = StripFileExtension(fileName); + fileName = fileName.StripFileExtension(); // underscores and dashes to spaces - fileName = ReplaceMany(fileName, new char[] { '_', '-' }, ' '); + fileName = fileName.ReplaceMany(new[] { '_', '-' }, ' '); // any other conversions ? // Pascalcase (to be done last) fileName = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(fileName); + // Replace multiple consecutive spaces with a single space + fileName = string.Join(" ", fileName.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); return fileName; } - } } diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index eb276664e6..59693e94a2 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -717,7 +717,7 @@ namespace Umbraco.Web.Editors mediaType = result.FormData["contentTypeAlias"]; } - var mediaItemName = fileName.friendlyNameFromFilename(); + var mediaItemName = fileName.ToFriendlyName(); var f = mediaService.CreateMedia(mediaItemName, parentId, mediaType, Security.CurrentUser.Id);