diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 723ff2efc9..3eedb69eb4 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -40,6 +40,25 @@ namespace Umbraco.Core ToCSharpEscapeChars[escape[0]] = escape[1]; } + internal static string StripFileExtension(this string fileName) + { + //filenames cannot contain line breaks + if (fileName.Contains(Environment.NewLine) || fileName.Contains("\r") || fileName.Contains("\n")) return fileName; + + var lastIndex = fileName.LastIndexOf('.'); + if (lastIndex > 0) + { + var ext = fileName.Substring(lastIndex); + //file extensions cannot contain whitespace + if (ext.Contains(" ")) return fileName; + + return string.Format("{0}", fileName.Substring(0, fileName.IndexOf(ext, StringComparison.Ordinal))); + } + return fileName; + + + } + /// /// This tries to detect a json string, this is not a fail safe way but it is quicker than doing /// a try/catch when deserializing when it is not json. diff --git a/src/Umbraco.Tests/CoreStrings/StringExtensionsTests.cs b/src/Umbraco.Tests/CoreStrings/StringExtensionsTests.cs index 89d03baa2d..e7007fe384 100644 --- a/src/Umbraco.Tests/CoreStrings/StringExtensionsTests.cs +++ b/src/Umbraco.Tests/CoreStrings/StringExtensionsTests.cs @@ -27,6 +27,16 @@ namespace Umbraco.Tests.CoreStrings ShortStringHelperResolver.Reset(); } + [TestCase("hello.txt", "hello")] + [TestCase("this.is.a.Txt", "this.is.a")] + [TestCase("this.is.not.a. Txt", "this.is.not.a. Txt")] + [TestCase("not a file","not a file")] + public void Strip_File_Extension(string input, string result) + { + var stripped = input.StripFileExtension(); + Assert.AreEqual(stripped, result); + } + [TestCase("This is a string to encrypt")] [TestCase("This is a string to encrypt\nThis is a second line")] [TestCase(" White space is preserved ")] diff --git a/src/Umbraco.Web.UI.Client/src/less/tree.less b/src/Umbraco.Web.UI.Client/src/less/tree.less index 9376f54e8a..e843499d2e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/tree.less +++ b/src/Umbraco.Web.UI.Client/src/less/tree.less @@ -48,9 +48,6 @@ padding-left: 20px; } -.umb-tree li .file-ext { - color: @grayLight; -} .umb-tree li.root > div h5 { margin-top: 10px; diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/umb-contextmenu.html b/src/Umbraco.Web.UI.Client/src/views/directives/umb-contextmenu.html index faeb90033f..0aa58c8fae 100644 --- a/src/Umbraco.Web.UI.Client/src/views/directives/umb-contextmenu.html +++ b/src/Umbraco.Web.UI.Client/src/views/directives/umb-contextmenu.html @@ -1,6 +1,6 @@
-

+

{{menuDialogTitle}}

diff --git a/src/Umbraco.Web/Trees/PartialViewsTree.cs b/src/Umbraco.Web/Trees/PartialViewsTree.cs index 341a906d25..c971f9573d 100644 --- a/src/Umbraco.Web/Trees/PartialViewsTree.cs +++ b/src/Umbraco.Web/Trees/PartialViewsTree.cs @@ -70,6 +70,8 @@ namespace Umbraco.Web.Trees ChangeNodeAction(xNode); xNode.Icon = "settingView.gif"; xNode.OpenIcon = "settingView.gif"; + + xNode.Text = xNode.Text.StripFileExtension(); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs index db81d1b68e..2349d8943f 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/FileSystemTree.cs @@ -103,8 +103,7 @@ namespace umbraco.cms.presentation.Trees XmlTreeNode xFileNode = XmlTreeNode.Create(this); xFileNode.NodeID = orgPath + file.Name; - xFileNode.Text = - string.Format("{0}", file.Name.Substring(0, file.Name.IndexOf(file.Extension, StringComparison.Ordinal))); + xFileNode.Text = file.Name; if (!((orgPath == ""))) xFileNode.Action = "javascript:openFile('" + orgPath + file.Name + "');"; else diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDLRScripts.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDLRScripts.cs index c64e044400..a941772b23 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDLRScripts.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadDLRScripts.cs @@ -1,28 +1,7 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.IO; -using System.Text; -using System.Web; -using System.Xml; -using System.Configuration; -using umbraco.BasePages; -using umbraco.BusinessLogic; -using umbraco.cms.businesslogic; -using umbraco.cms.businesslogic.cache; -using umbraco.cms.businesslogic.contentitem; -using umbraco.cms.businesslogic.datatype; -using umbraco.cms.businesslogic.language; -using umbraco.cms.businesslogic.media; -using umbraco.cms.businesslogic.member; -using umbraco.cms.businesslogic.property; -using umbraco.cms.businesslogic.web; -using umbraco.interfaces; -using umbraco.DataLayer; -using umbraco.BusinessLogic.Utils; +using System.Text; using umbraco.cms.presentation.Trees; using Umbraco.Core.IO; +using Umbraco.Core; namespace umbraco @@ -92,6 +71,8 @@ namespace umbraco xNode.Icon = icon; xNode.OpenIcon = icon; + + xNode.Text = xNode.Text.StripFileExtension(); } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadScripts.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadScripts.cs index 91f5d57caa..f74cc78be4 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadScripts.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadScripts.cs @@ -79,7 +79,7 @@ namespace umbraco xNode.Action = xNode.Action.Replace("openFile", "openScriptEditor"); // add special icons for javascript files - if (xNode.Action.Contains(".js")) + if (xNode.Text.Contains(".js")) { xNode.Icon = "icon-script"; xNode.OpenIcon = "icon-script"; @@ -89,6 +89,8 @@ namespace umbraco xNode.Icon = "icon-code"; xNode.OpenIcon = "icon-code"; } + + xNode.Text = xNode.Text.StripFileExtension(); } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheets.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheets.cs index 4fe41fe6ea..3a8b58005b 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheets.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadStylesheets.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Data; +using System.Globalization; using System.IO; using System.Text; using System.Web; @@ -63,7 +64,7 @@ namespace umbraco foreach (StyleSheet n in StyleSheet.GetAll()) { XmlTreeNode xNode = XmlTreeNode.Create(this); - xNode.NodeID = n.Id.ToString(); + xNode.NodeID = n.Id.ToString(CultureInfo.InvariantCulture); xNode.Text = n.Text; xNode.Action = "javascript:openStylesheet(" + n.Id + ");"; loadStylesheetProperty styleSheetPropertyTree = new loadStylesheetProperty(this.app); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadXslt.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadXslt.cs index 49c54554c2..4a03b31551 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadXslt.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadXslt.cs @@ -73,6 +73,8 @@ function openXslt(id) { xNode.Action = xNode.Action.Replace("openFile", "openXslt"); xNode.Icon = "icon-code"; xNode.OpenIcon = "icon-code"; + + xNode.Text = xNode.Text.StripFileExtension(); } protected override void OnRenderFolderNode(ref XmlTreeNode xNode)