From 4946252f7e9324de891481c2587298355e6bba6e Mon Sep 17 00:00:00 2001 From: Daniel Lackenby Date: Tue, 17 Nov 2015 15:47:41 +0000 Subject: [PATCH 01/13] Filter out when no contentTypeNames provided Previously, when no content type names where provided (from a prior conditional statement, so there is an initialized array but it is empty) then the filtering steps are skipped and instead of serving "no content types", as an empty array would state: all content types are served. When contentTypeNamed.Length == 0, still .Select() as this is safe for empty collections and will filter out all types in this event. --- src/Orchard/ContentManagement/DefaultContentQuery.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard/ContentManagement/DefaultContentQuery.cs b/src/Orchard/ContentManagement/DefaultContentQuery.cs index befcd03aa..a1cf3ad4f 100644 --- a/src/Orchard/ContentManagement/DefaultContentQuery.cs +++ b/src/Orchard/ContentManagement/DefaultContentQuery.cs @@ -92,7 +92,7 @@ namespace Orchard.ContentManagement { } private void ForType(params string[] contentTypeNames) { - if (contentTypeNames != null && contentTypeNames.Length != 0) { + if (contentTypeNames != null) { var contentTypeIds = contentTypeNames.Select(GetContentTypeRecordId).ToArray(); // don't use the IN operator if not needed for performance reasons if (contentTypeNames.Length == 1) { From c6b1754bd788dc0bc9a4f9d32ad386cf3303281a Mon Sep 17 00:00:00 2001 From: Daniel Lackenby Date: Wed, 18 Nov 2015 16:08:50 +0000 Subject: [PATCH 02/13] Limit Admin Menu for Content Limit the Content Menu item by whether you have the base Permission EditOwnContent. EditContent implies EditOwnContent so either permission (which you need at least one of to do any management of content be it create or edit) will allow this menu item to display. --- src/Orchard.Web/Core/Contents/AdminMenu.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Orchard.Web/Core/Contents/AdminMenu.cs b/src/Orchard.Web/Core/Contents/AdminMenu.cs index b95bf0561..7feb18d7f 100644 --- a/src/Orchard.Web/Core/Contents/AdminMenu.cs +++ b/src/Orchard.Web/Core/Contents/AdminMenu.cs @@ -22,6 +22,7 @@ namespace Orchard.Core.Contents { var contentTypeDefinitions = _contentDefinitionManager.ListTypeDefinitions().OrderBy(d => d.Name); builder.AddImageSet("content") .Add(T("Content"), "1.4", menu => menu + .Permission(Permissions.EditOwnContent) .Add(T("Content Items"), "1", item => item.Action("List", "Admin", new { area = "Contents", id = "" }).LocalNav())); var contentTypes = contentTypeDefinitions.Where(ctd => ctd.Settings.GetModel().Creatable).OrderBy(ctd => ctd.DisplayName); if (contentTypes.Any()) { From ccaa47b200fc7284f505e2e3c4e5d60fba79f038 Mon Sep 17 00:00:00 2001 From: Thierry Fleury Date: Wed, 18 Nov 2015 19:33:18 +0100 Subject: [PATCH 03/13] Fixes #6023 : Ellipsize can spilt an HTML encoded character --- .../Utility/Extensions/StringExtensionsTests.cs | 2 +- src/Orchard/Mvc/Html/HtmlHelperExtensions.cs | 7 +++---- src/Orchard/Utility/Extensions/StringExtensions.cs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs index d266d85f8..47a627ee4 100644 --- a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs +++ b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs @@ -52,7 +52,7 @@ namespace Orchard.Tests.Utility.Extensions { [Test] public void Ellipsize_LongStringTruncatedToNearestWord() { const string toEllipsize = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed purus quis purus orci aliquam."; - Assert.That(toEllipsize.Ellipsize(46), Is.StringMatching("Lorem ipsum dolor sit amet, consectetur …")); + Assert.That(toEllipsize.Ellipsize(46), Is.StringMatching("Lorem ipsum dolor sit amet, consectetur …")); } [Test] diff --git a/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs b/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs index ac3d1d948..a56d60f84 100644 --- a/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs +++ b/src/Orchard/Mvc/Html/HtmlHelperExtensions.cs @@ -175,11 +175,11 @@ namespace Orchard.Mvc.Html { #region Ellipsize public static IHtmlString Ellipsize(this HtmlHelper htmlHelper, string text, int characterCount) { - return new HtmlString(htmlHelper.Encode(text).Ellipsize(characterCount)); + return new HtmlString(htmlHelper.Encode(text.Ellipsize(characterCount))); } public static IHtmlString Ellipsize(this HtmlHelper htmlHelper, string text, int characterCount, string ellipsis) { - return new HtmlString(htmlHelper.Encode(text).Ellipsize(characterCount, ellipsis)); + return new HtmlString(htmlHelper.Encode(text.Ellipsize(characterCount, ellipsis))); } #endregion @@ -187,8 +187,7 @@ namespace Orchard.Mvc.Html { #region Excerpt public static MvcHtmlString Excerpt(this HtmlHelper html, string markup, int length) { - - return MvcHtmlString.Create(markup.RemoveTags().Ellipsize(length)); + return MvcHtmlString.Create(html.Encode(HttpUtility.HtmlDecode(markup.RemoveTags()).Ellipsize(length))); } #endregion diff --git a/src/Orchard/Utility/Extensions/StringExtensions.cs b/src/Orchard/Utility/Extensions/StringExtensions.cs index 1e66a8248..dbbc211b3 100644 --- a/src/Orchard/Utility/Extensions/StringExtensions.cs +++ b/src/Orchard/Utility/Extensions/StringExtensions.cs @@ -26,7 +26,7 @@ namespace Orchard.Utility.Extensions { } public static string Ellipsize(this string text, int characterCount) { - return text.Ellipsize(characterCount, " …"); + return text.Ellipsize(characterCount, " …"); } public static string Ellipsize(this string text, int characterCount, string ellipsis, bool wordBoundary = false) { From 5bfb858e3b3e2f5a8f03e83f8d67b8240e9c90b5 Mon Sep 17 00:00:00 2001 From: Thierry Fleury Date: Thu, 19 Nov 2015 08:58:49 +0100 Subject: [PATCH 04/13] Use non-breaking space instead of standard space in Ellipsize. --- src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs | 2 +- src/Orchard/Utility/Extensions/StringExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs index 47a627ee4..58fed7978 100644 --- a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs +++ b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs @@ -52,7 +52,7 @@ namespace Orchard.Tests.Utility.Extensions { [Test] public void Ellipsize_LongStringTruncatedToNearestWord() { const string toEllipsize = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed purus quis purus orci aliquam."; - Assert.That(toEllipsize.Ellipsize(46), Is.StringMatching("Lorem ipsum dolor sit amet, consectetur …")); + Assert.That(toEllipsize.Ellipsize(46), Is.StringMatching("Lorem ipsum dolor sit amet, consectetur\u00A0\u2026")); } [Test] diff --git a/src/Orchard/Utility/Extensions/StringExtensions.cs b/src/Orchard/Utility/Extensions/StringExtensions.cs index dbbc211b3..542aea910 100644 --- a/src/Orchard/Utility/Extensions/StringExtensions.cs +++ b/src/Orchard/Utility/Extensions/StringExtensions.cs @@ -26,7 +26,7 @@ namespace Orchard.Utility.Extensions { } public static string Ellipsize(this string text, int characterCount) { - return text.Ellipsize(characterCount, " …"); + return text.Ellipsize(characterCount, "\u00A0\u2026"); } public static string Ellipsize(this string text, int characterCount, string ellipsis, bool wordBoundary = false) { From 062a786f610bfb1efb1296fee53c3b52f8374142 Mon Sep 17 00:00:00 2001 From: Thierry Fleury Date: Thu, 19 Nov 2015 09:00:31 +0100 Subject: [PATCH 05/13] Add new HtmlHelperExtensions tests for Ellipsize and Excerpt methods --- .../Mvc/Html/HtmlHelperExtensionsTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs b/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs index efbc0483b..4ed2b66ab 100644 --- a/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs +++ b/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs @@ -193,5 +193,35 @@ namespace Orchard.Tests.Mvc.Html { Assert.AreEqual(@"", result.ToString()); } private class FooController : Controller { } + + [Test] + public void Ellipsize_DontCutHtmlEncodedChars() { + //arrange + var viewContext = new ViewContext(); + var viewDataContainer = new Mock(); + var html = new HtmlHelper(viewContext, viewDataContainer.Object); + + //act + var result = html.Ellipsize("foo & bar", 5); + + //assert + Assert.AreEqual("foo & \u2026", result.ToString()); + + } + + [Test] + public void Excerpt_DontCutHtmlEncodedChars() { + //arrange + var viewContext = new ViewContext(); + var viewDataContainer = new Mock(); + var html = new HtmlHelper(viewContext, viewDataContainer.Object); + + //act + var result = html.Excerpt("

foo & bar

", 5); + + //assert + Assert.AreEqual("foo & \u2026", result.ToString()); + + } } } From 411e04b56aa3327f9aa02f73a55f41a9a0de2735 Mon Sep 17 00:00:00 2001 From: Thierry Fleury Date: Thu, 19 Nov 2015 09:29:35 +0100 Subject: [PATCH 06/13] Make Excerpt test more accurate --- src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs b/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs index 4ed2b66ab..31f55cd3c 100644 --- a/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs +++ b/src/Orchard.Tests/Mvc/Html/HtmlHelperExtensionsTests.cs @@ -217,7 +217,7 @@ namespace Orchard.Tests.Mvc.Html { var html = new HtmlHelper(viewContext, viewDataContainer.Object); //act - var result = html.Excerpt("

foo & bar

", 5); + var result = html.Excerpt("

foo & bar

", 7); //assert Assert.AreEqual("foo & \u2026", result.ToString()); From b3bf80395a7a8b4f5e5b82c683082a6f766c06be Mon Sep 17 00:00:00 2001 From: Marek Dzikiewicz Date: Thu, 19 Nov 2015 23:01:50 +0100 Subject: [PATCH 07/13] Fix TextTokens - Format and TrimEnd This fixes the Format and TrimEnd tokens and adds unit tests for all TextTokens. --- .../Orchard.Tokens/Providers/TextTokens.cs | 4 +- .../Tests/Orchard.Tokens.Tests.csproj | 1 + .../Orchard.Tokens/Tests/TextTokenTests.cs | 121 ++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Tokens/Tests/TextTokenTests.cs diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Providers/TextTokens.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Providers/TextTokens.cs index 255cee809..a2ed223d6 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Providers/TextTokens.cs +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Providers/TextTokens.cs @@ -35,7 +35,7 @@ namespace Orchard.Tokens.Providers { // {Text.Format:} .Token( token => FilterTokenParam("Format:", token), - (token, d) => String.Format(d, token)) + (token, d) => String.Format(token, d)) // {Text.TrimEnd:} .Token(token => FilterTokenParam("TrimEnd:", token), TrimEnd) .Token("UrlEncode", HttpUtility.UrlEncode) @@ -54,7 +54,7 @@ namespace Orchard.Tokens.Providers { return token.StartsWith(tokenName, StringComparison.OrdinalIgnoreCase) ? token.Substring(tokenName.Length) : null; } - private static string TrimEnd(string token, string param) { + private static string TrimEnd(string param, string token) { if (String.IsNullOrEmpty(param)) { return token; } diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Tests/Orchard.Tokens.Tests.csproj b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/Orchard.Tokens.Tests.csproj index cb0d795ae..73b279d67 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Tests/Orchard.Tokens.Tests.csproj +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/Orchard.Tokens.Tests.csproj @@ -56,6 +56,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TextTokenTests.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TextTokenTests.cs new file mode 100644 index 000000000..5643bb856 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TextTokenTests.cs @@ -0,0 +1,121 @@ +using System.Web; +using Autofac; +using NUnit.Framework; +using Orchard.Tokens.Implementation; +using Orchard.Tokens.Providers; + +namespace Orchard.Tokens.Tests { + [TestFixture] + public class TextTokenTests { + private IContainer _container; + private ITokenizer _tokenizer; + + [SetUp] + public void Init() { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + _container = builder.Build(); + _tokenizer = _container.Resolve(); + } + + [Test] + public void TestLimitWhenStringShorterThanLimit() { + var str = "foo bar baz"; + var result = _tokenizer.Replace("{Text.Limit:" + (str.Length + 1) + "}", new { Text = str }); + Assert.That(result, Is.EqualTo("foo bar baz")); + } + + [Test] + public void TestLimitWhenStringLengthEqualsLimit() { + var str = "foo bar baz"; + var result = _tokenizer.Replace("{Text.Limit:" + str.Length + "}", new { Text = str }); + Assert.That(result, Is.EqualTo("foo bar baz")); + } + + [Test] + public void TestLimitWhenStringLongerThanLimit() { + var str = "foo bar baz"; + var result = _tokenizer.Replace("{Text.Limit:" + (str.Length - 1) + "}", new { Text = str }); + Assert.That(result, Is.EqualTo("foo bar ba")); + } + + [Test] + public void TestLimitWhenStringEmpty() { + var str = ""; + var result = _tokenizer.Replace("{Text.Limit:" + (str.Length - 1) + "}", new { Text = str }); + Assert.That(result, Is.EqualTo("")); + } + + [Test] + public void TestLimitWhenEllipsisSpecifed() { + var str = "foo bar baz"; + var result = _tokenizer.Replace("{Text.Limit:" + (str.Length - 1) + ",...}", new { Text = str }); + Assert.That(result, Is.EqualTo("foo bar ba...")); + } + + [Test] + public void TestFormat() { + var str = "bar"; + var result = _tokenizer.Replace("{Text.Format:foo {0} baz}", new { Text = str }); + Assert.That(result, Is.EqualTo("foo bar baz")); + } + + [Test] + public void TestTrimEnd() { + var str = "foo "; + var result = _tokenizer.Replace("{Text.TrimEnd: }", new { Text = str }); + Assert.That(result, Is.EqualTo("foo")); + } + + [Test] + public void TestTrimEndNumber() { + var str = "foobarbaz"; + var result = _tokenizer.Replace("{Text.TrimEnd:3}", new { Text = str }); + Assert.That(result, Is.EqualTo("foobar")); + } + + [Test] + public void TestTrimEndWhenEmptyArg() { + var str = "foobarbaz"; + var result = _tokenizer.Replace("{Text.TrimEnd:}", new { Text = str }); + Assert.That(result, Is.EqualTo("foobarbaz")); + } + + [TestCase("foobar", "foo%3ebar")] + [TestCase("foo'bar", "foo%27bar")] + [TestCase("foo\"bar", "foo%22bar")] + [TestCase("foo bar", "foo+bar")] + public void TestUrlEncode(string str, string expected) { + var result = _tokenizer.Replace("{Text.UrlEncode}", new { Text = str }); + Assert.That(result, Is.EqualTo(expected)); + } + + [TestCase("foobar", "foo>bar")] + [TestCase("foo&bar", "foo&bar")] + [TestCase("foo\"bar", "foo"bar")] + [TestCase("foo'bar", "foo'bar")] + public void TestHtmlEncode(string str, string expected) { + var result = _tokenizer.Replace("{Text.HtmlEncode}", new { Text = str }, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + Assert.That(result, Is.EqualTo(expected)); + } + + [Test] + public void TestJavaScriptEncode() { + var str = "f\"ooba'z"; + var result = _tokenizer.Replace("{Text.JavaScriptEncode}", new { Text = str }, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + Assert.That(result, Is.EqualTo(HttpUtility.JavaScriptStringEncode(str))); + } + + [Test] + public void TestLineEncode() { + var str = "foo" + System.Environment.NewLine + "bar" + System.Environment.NewLine + "baz"; + var result = _tokenizer.Replace("{Text.LineEncode}", new { Text = str }, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + Assert.That(result, Is.EqualTo("foo
bar
baz")); + } + } +} \ No newline at end of file From 4db088fb9cdf28c490905544928c698aa07028db Mon Sep 17 00:00:00 2001 From: mkinawy Date: Fri, 20 Nov 2015 21:08:10 +0200 Subject: [PATCH 08/13] fixes #5978 by moving the select button to the top of the media picker window and hides the save button untill some image is selected --- .../Orchard.MediaLibrary/Scripts/media-library-picker.js | 5 ++++- .../Modules/Orchard.MediaLibrary/Styles/dialog-mode.css | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library-picker.js b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library-picker.js index 62f0c94fa..f8004e84b 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library-picker.js +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library-picker.js @@ -14,6 +14,7 @@ var promptOnNavigate = element.data("prompt-on-navigate"); var showSaveWarning = element.data("show-save-warning"); var addButton = element.find(".button.add"); + var saveButton = $('.button.save'); var removeAllButton = element.find(".button.remove"); var template = '
  • {thumbnail}

    {title}

    ' + removeText + '' + pipe + '' + editText + '
  • '; @@ -28,10 +29,12 @@ var itemsCount = element.find(".media-library-picker-item").length; if(!multiple && itemsCount > 0) { - addButton.hide(); + addButton.hide(); + saveButton.show(); } else { addButton.show(); + saveButton.hide(); } if(itemsCount > 1) { diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/dialog-mode.css b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/dialog-mode.css index eae728eb1..d141ab21d 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/dialog-mode.css +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/dialog-mode.css @@ -6,6 +6,8 @@ .media-library-modal-window #media-library-main-selection-select { display: inherit; + position: absolute; + top: 25px; } .media-library-modal-window #main { From 23d81181ed1b4dd7ea660eafdcc374870ce33785 Mon Sep 17 00:00:00 2001 From: mkinawy Date: Sat, 21 Nov 2015 00:07:08 +0200 Subject: [PATCH 09/13] fixes #6052 by making Href return the url path as-is if it starts with http or https --- .../Mvc/ViewEngines/Razor/WebViewPage.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs b/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs index 3964858e5..6d261c35e 100644 --- a/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs +++ b/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs @@ -23,22 +23,22 @@ namespace Orchard.Mvc.ViewEngines.Razor { private object _display; private object _layout; - public Localizer T { + public Localizer T { get { // first time used, create it - if(_localizer == NullLocalizer.Instance) { - + if (_localizer == NullLocalizer.Instance) { + // if the Model is a shape, get localization scopes from binding sources // e.g., Logon.cshtml in a theme, overriging Users/Logon.cshtml, needs T to // fallback to the one in Users var shape = Model as IShape; - if(shape != null && shape.Metadata.BindingSources.Count > 1) { + if (shape != null && shape.Metadata.BindingSources.Count > 1) { var localizers = shape.Metadata.BindingSources.Reverse().Select(scope => LocalizationUtilities.Resolve(ViewContext, scope)).ToList(); - _localizer = (text, args) => { - foreach(var localizer in localizers) { + _localizer = (text, args) => { + foreach (var localizer in localizers) { var hint = localizer(text, args); // if not localized using this scope, use next scope - if(hint.Text != text) { + if (hint.Text != text) { return hint; } } @@ -54,7 +54,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { } return _localizer; - } + } } public dynamic Display { get { return _display; } } @@ -79,7 +79,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { } private IAuthorizer _authorizer; - public IAuthorizer Authorizer { + public IAuthorizer Authorizer { get { return _authorizer ?? (_authorizer = WorkContext.Resolve()); } @@ -128,7 +128,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { public void SetMeta(string name = null, string content = null, string httpEquiv = null, string charset = null) { var metaEntry = new MetaEntry(); - + if (!String.IsNullOrEmpty(name)) { metaEntry.Name = name; } @@ -164,7 +164,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { base.InitHelpers(); WorkContext = ViewContext.GetWorkContext(); - + _display = DisplayHelperFactory.CreateHelper(ViewContext, this); _layout = WorkContext.Layout; } @@ -195,6 +195,11 @@ namespace Orchard.Mvc.ViewEngines.Razor { private string _tenantPrefix; public override string Href(string path, params object[] pathParts) { + if (path.StartsWith("http://", StringComparison.OrdinalIgnoreCase) + || path.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) { + return path; + } + if (_tenantPrefix == null) { _tenantPrefix = WorkContext.Resolve().RequestUrlPrefix ?? ""; } From d0175e6ccd92b2814d8037c02acda298a7538eb3 Mon Sep 17 00:00:00 2001 From: mkinawy Date: Sat, 21 Nov 2015 00:12:36 +0200 Subject: [PATCH 10/13] reverting file annotations --- .../Mvc/ViewEngines/Razor/WebViewPage.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs b/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs index 6d261c35e..1dac8f431 100644 --- a/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs +++ b/src/Orchard/Mvc/ViewEngines/Razor/WebViewPage.cs @@ -23,22 +23,22 @@ namespace Orchard.Mvc.ViewEngines.Razor { private object _display; private object _layout; - public Localizer T { + public Localizer T { get { // first time used, create it - if (_localizer == NullLocalizer.Instance) { - + if(_localizer == NullLocalizer.Instance) { + // if the Model is a shape, get localization scopes from binding sources // e.g., Logon.cshtml in a theme, overriging Users/Logon.cshtml, needs T to // fallback to the one in Users var shape = Model as IShape; - if (shape != null && shape.Metadata.BindingSources.Count > 1) { + if(shape != null && shape.Metadata.BindingSources.Count > 1) { var localizers = shape.Metadata.BindingSources.Reverse().Select(scope => LocalizationUtilities.Resolve(ViewContext, scope)).ToList(); - _localizer = (text, args) => { - foreach (var localizer in localizers) { + _localizer = (text, args) => { + foreach(var localizer in localizers) { var hint = localizer(text, args); // if not localized using this scope, use next scope - if (hint.Text != text) { + if(hint.Text != text) { return hint; } } @@ -54,7 +54,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { } return _localizer; - } + } } public dynamic Display { get { return _display; } } @@ -79,7 +79,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { } private IAuthorizer _authorizer; - public IAuthorizer Authorizer { + public IAuthorizer Authorizer { get { return _authorizer ?? (_authorizer = WorkContext.Resolve()); } @@ -128,7 +128,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { public void SetMeta(string name = null, string content = null, string httpEquiv = null, string charset = null) { var metaEntry = new MetaEntry(); - + if (!String.IsNullOrEmpty(name)) { metaEntry.Name = name; } @@ -164,7 +164,7 @@ namespace Orchard.Mvc.ViewEngines.Razor { base.InitHelpers(); WorkContext = ViewContext.GetWorkContext(); - + _display = DisplayHelperFactory.CreateHelper(ViewContext, this); _layout = WorkContext.Layout; } From 715d557f32cf35581ac9d36dc324921756334292 Mon Sep 17 00:00:00 2001 From: Marek Dzikiewicz Date: Sun, 22 Nov 2015 18:25:22 +0100 Subject: [PATCH 11/13] Fix handling braces in tokens This brings Tokenizer changes from changeset 423fec90b3494a2482ec186ad521862e9ed7be1e --- .../Implementation/Tokenizer.cs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs index 86be74bc6..623595560 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs @@ -59,7 +59,7 @@ namespace Orchard.Tokens.Implementation { private static Tuple> Parse(string text, bool hashMode) { var tokens = new List(); if (!String.IsNullOrEmpty(text)) { - var inToken = false; + var inTokenDepth = 0; var tokenStart = 0; for (var i = 0; i < text.Length; i++) { var c = text[i]; @@ -70,29 +70,32 @@ namespace Orchard.Tokens.Implementation { continue; } } - else if (c == '}' && !(inToken)) { + else if (c == '}' && inTokenDepth == 0) { if (i + 1 < text.Length && text[i + 1] == '}') { text = text.Substring(0, i) + text.Substring(i + 1); continue; } } - if (inToken) { + if (inTokenDepth > 0) { if (c == '}') { - inToken = false; - var token = text.Substring(tokenStart + 1, i - tokenStart - 1); - tokens.Add(token); + inTokenDepth--; + if (inTokenDepth == 0) { + var token = text.Substring(tokenStart + 1, i - tokenStart - 1); + tokens.Add(token); + } } } - else if (!hashMode && c == '{') { - inToken = true; - tokenStart = i; + + if (!hashMode && c == '{') { + if (inTokenDepth == 0) tokenStart = i; + inTokenDepth++; } else if (hashMode && c == '#' && i + 1 < text.Length && text[i + 1] == '{' - && (i + 2 > text.Length || text[i + 2] != '{') ) { - inToken = true; - tokenStart = i+1; + && (i + 2 > text.Length || text[i + 2] != '{') ) { + if (inTokenDepth == 0) tokenStart = i+1; + inTokenDepth++; } } } From 1c4c64b8129d2bb8b6ae70eaacbfdbce3b51f63e Mon Sep 17 00:00:00 2001 From: Lombiq Date: Tue, 24 Nov 2015 17:17:12 +0100 Subject: [PATCH 12/13] Fixing that widgets with name containing dash can't have named alternates #3379 --- src/Orchard.Web/Modules/Orchard.Widgets/Shapes.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Shapes.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Shapes.cs index 23c716df5..8108f3c95 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Shapes.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Shapes.cs @@ -39,7 +39,12 @@ namespace Orchard.Widgets { widget.Classes.Add("widget-" + widgetPart.Name); // Widget__Name__[Name] - displaying.ShapeMetadata.Alternates.Add("Widget__Name__" + widgetPart.Name); + if (widgetPart.Name.Contains("-")) { + displaying.ShapeMetadata.Alternates.Add("Widget__Name__" + widgetPart.Name.Replace("-", "__")); + } + else { + displaying.ShapeMetadata.Alternates.Add("Widget__Name__" + widgetPart.Name); + } } } From eb81c20f04b7eb1a643caf2a37c8db827dc3c8d3 Mon Sep 17 00:00:00 2001 From: Daniel Stolt Date: Tue, 24 Nov 2015 19:14:31 +0100 Subject: [PATCH 13/13] Set UseGlobalApplicationHostFile=True in Orchard.Web.csproj. This prevents VS2015 from creating a local applicationHost.config file in the solution, which in our case is excluded from source control anyway and therefore isn't used as intended. --- src/Orchard.Web/Orchard.Web.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Web/Orchard.Web.csproj b/src/Orchard.Web/Orchard.Web.csproj index 5bd1931aa..50d922899 100644 --- a/src/Orchard.Web/Orchard.Web.csproj +++ b/src/Orchard.Web/Orchard.Web.csproj @@ -20,6 +20,7 @@ disabled false + True true @@ -239,7 +240,7 @@ - @@ -280,4 +281,4 @@ --> - \ No newline at end of file +