From 8dbdd67c98e5f2cb337529a61e1de2db70a985c2 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 13 Nov 2013 12:33:03 +1100 Subject: [PATCH] Reverted CleanStringForSafeFileName to the original name that doesn't strip unnecessary characters. --- .../Strings/DefaultShortStringHelper.cs | 91 +++++++++++++++++-- 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs index 547cf6090d..5e0ccae655 100644 --- a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs +++ b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; using Umbraco.Core.Configuration; namespace Umbraco.Core.Strings @@ -299,19 +301,90 @@ function validateSafeAlias(id, value, immediate, callback) {{ /// Legacy says this was used to "overcome an issue when Umbraco is used in IE in an intranet environment" but that issue is not documented. public virtual string CleanStringForSafeFileName(string text) { - if (string.IsNullOrWhiteSpace(text)) - return string.Empty; + // - Original version - text = text.ReplaceMany(Path.GetInvalidFileNameChars(), '-'); + if (String.IsNullOrEmpty(text)) + return String.Empty; - var pos = text.LastIndexOf('.'); - var name = pos < 0 ? text : text.Substring(0, pos); - var ext = pos < 0 ? string.Empty : text.Substring(pos + 1); + text = string.IsNullOrWhiteSpace(text) == false + ? text.ReplaceMany(Path.GetInvalidFileNameChars(), '-') + : string.Empty; - name = CleanString(name, CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.LowerCase, '-'); - ext = CleanString(ext, CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.LowerCase, '-'); + //Break up the file in name and extension before applying the UrlReplaceCharacters + var fileNamePart = text.Substring(0, text.LastIndexOf('.')); + var ext = text.Substring(text.LastIndexOf('.')); - return pos < 0 ? name : (name + "." + ext); + fileNamePart = ApplyUrlReplaceCharacters(fileNamePart); + + text = string.Concat(fileNamePart, ext); + + // Adapted from: http://stackoverflow.com/a/4827510/5018 + // Combined both Reserved Characters and Character Data + // from http://en.wikipedia.org/wiki/Percent-encoding + var stringBuilder = new StringBuilder(); + + const string reservedCharacters = "!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| "; + + foreach (var character in text) + { + if (reservedCharacters.IndexOf(character) == -1) + stringBuilder.Append(character); + else + stringBuilder.Append("-"); + } + + // Remove repeating dashes + // From: http://stackoverflow.com/questions/5111967/regex-to-remove-a-specific-repeated-character + var reducedString = Regex.Replace(stringBuilder.ToString(), "-+", "-"); + + return reducedString; + + + // - Version 2 (Legacy Short string) + + //const string UmbracoValidAliasCharacters = "_-abcdefghijklmnopqrstuvwxyz1234567890"; + //const string UmbracoInvalidFirstCharacters = "0123456789"; + //const string validAliasCharacters = UmbracoValidAliasCharacters; + //const string invalidFirstCharacters = UmbracoInvalidFirstCharacters; + //var safeString = new StringBuilder(); + //int aliasLength = text.Length; + //for (var i = 0; i < aliasLength; i++) + //{ + // var currentChar = text.Substring(i, 1); + // if (validAliasCharacters.Contains(currentChar.ToLowerInvariant())) + // { + // // check for camel (if previous character is a space, we'll upper case the current one + // if (safeString.Length == 0 && invalidFirstCharacters.Contains(currentChar.ToLowerInvariant())) + // { + // //currentChar = ""; + // } + // else + // { + // if (i < aliasLength - 1 && i > 0 && text.Substring(i - 1, 1) == " ") + // currentChar = currentChar.ToUpperInvariant(); + + // safeString.Append(currentChar); + // } + // } + //} + //return safeString.ToString(); + + + // - Version 3 (Default short string) + + //if (string.IsNullOrWhiteSpace(text)) + // return string.Empty; + + //text = text.ReplaceMany(Path.GetInvalidFileNameChars(), '-'); + + //var pos = text.LastIndexOf('.'); + //var name = pos < 0 ? text : text.Substring(0, pos); + //var ext = pos < 0 ? string.Empty : text.Substring(pos + 1); + + //name = CleanString(name, CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.LowerCase, '-'); + //ext = CleanString(ext, CleanStringType.Ascii | CleanStringType.Alias | CleanStringType.LowerCase, '-'); + + //return pos < 0 ? name : (name + "." + ext); } ///