From a78ed663d0a46365f4aa779b233385e9d7154c90 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 29 Jan 2015 17:36:33 -0800 Subject: [PATCH] Add ability for wildcards in @addtaghelper and @removetaghelper. - @addtaghelper and @removetaghelper can now utilize the '*' wild card to represent 0 or more characters. - Restricted the @addtaghelper to need the TypeName. @addtaghelper "MyAssemblyName" => @addtaghelper "*, MyAssemblyName". #285 --- .../Properties/Resources.Designer.cs | 8 ++--- .../Resources.resx | 4 +-- .../TagHelpers/TagHelperDescriptorResolver.cs | 32 ++++++++----------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.Razor.Runtime/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Razor.Runtime/Properties/Resources.Designer.cs index c8d7f462c1..dc9bb027a3 100644 --- a/src/Microsoft.AspNet.Razor.Runtime/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Razor.Runtime/Properties/Resources.Designer.cs @@ -11,9 +11,7 @@ namespace Microsoft.AspNet.Razor.Runtime = new ResourceManager("Microsoft.AspNet.Razor.Runtime.Resources", typeof(Resources).GetTypeInfo().Assembly); /// - /// Invalid tag helper directive look up text '{0}'. The correct look up text formats are: - /// "assemblyName" - /// "typeName, assemblyName" + /// Invalid tag helper directive look up text '{0}'. The correct look up text format is: "typeName, assemblyName". /// internal static string TagHelperDescriptorResolver_InvalidTagHelperLookupText { @@ -21,9 +19,7 @@ namespace Microsoft.AspNet.Razor.Runtime } /// - /// Invalid tag helper directive look up text '{0}'. The correct look up text formats are: - /// "assemblyName" - /// "typeName, assemblyName" + /// Invalid tag helper directive look up text '{0}'. The correct look up text format is: "typeName, assemblyName". /// internal static string FormatTagHelperDescriptorResolver_InvalidTagHelperLookupText(object p0) { diff --git a/src/Microsoft.AspNet.Razor.Runtime/Resources.resx b/src/Microsoft.AspNet.Razor.Runtime/Resources.resx index 6865dc5932..1c7a84dccb 100644 --- a/src/Microsoft.AspNet.Razor.Runtime/Resources.resx +++ b/src/Microsoft.AspNet.Razor.Runtime/Resources.resx @@ -118,9 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Invalid tag helper directive look up text '{0}'. The correct look up text formats are: -"assemblyName" -"typeName, assemblyName" + Invalid tag helper directive look up text '{0}'. The correct look up text format is: "typeName, assemblyName". Cannot resolve TagHelper containing assembly '{0}'. Error: {1} diff --git a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperDescriptorResolver.cs b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperDescriptorResolver.cs index 64ce1e5085..fe0fbf0a93 100644 --- a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperDescriptorResolver.cs +++ b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperDescriptorResolver.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using Microsoft.AspNet.Razor.Parser; using Microsoft.AspNet.Razor.TagHelpers; using Microsoft.AspNet.Razor.Text; @@ -113,8 +114,15 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers return false; } - return string.IsNullOrEmpty(lookupInfo.TypeName) || - string.Equals(descriptor.TypeName, lookupInfo.TypeName, StringComparison.Ordinal); + // We need to escape the TypePattern so we can choose to only allow specific regex. + var escaped = Regex.Escape(lookupInfo.TypePattern); + + // We surround the escaped with ^ and $ in order ot ensure a regex match matches the entire + // string. We also replace any '*' or '?' characters with regex to match appropriate content. + var pattern = "^" + escaped.Replace(@"\?", ".?").Replace(@"\*", ".*?") + "$"; + var regex = new Regex(pattern, RegexOptions.Singleline); + + return regex.IsMatch(descriptor.TypeName); } private static LookupInfo GetLookupInfo(TagHelperDirectiveDescriptor directiveDescriptor, @@ -128,7 +136,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // "typeName, assemblyName" if (lookupStrings == null || lookupStrings.Any(string.IsNullOrWhiteSpace) || - (lookupStrings.Length != 1 && lookupStrings.Length != 2)) + lookupStrings.Length != 2) { errorSink.OnError( directiveDescriptor.Location, @@ -137,22 +145,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers return null; } - // Grab the assembly name from the lookup text strings. Due to our supported lookupText formats it will - // always be the last element provided. - var assemblyName = lookupStrings.Last().Trim(); - string typeName = null; - - // Check if the lookupText specifies a type to search for. - if (lookupStrings.Length == 2) - { - // The user provided a type name. Retrieve it so we can prune our descriptors. - typeName = lookupStrings[0].Trim(); - } - return new LookupInfo { - AssemblyName = assemblyName, - TypeName = typeName + TypePattern = lookupStrings[0].Trim(), + AssemblyName = lookupStrings[1].Trim() }; } @@ -160,7 +156,7 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { public string AssemblyName { get; set; } - public string TypeName { get; set; } + public string TypePattern { get; set; } } } } \ No newline at end of file