private ArgumentCollection getArguments(TagDefinition definition, Match match, List<Context> context) { // make sure we don't have too many arguments List<Capture> captures = match.Groups["argument"].Captures.Cast<Capture>().ToList(); List<TagParameter> parameters = definition.Parameters.ToList(); if (captures.Count > parameters.Count) { string message = String.Format(Resources.WrongNumberOfArguments, definition.Name); throw new FormatException(message); } // provide default values for missing arguments if (captures.Count < parameters.Count) { captures.AddRange(Enumerable.Repeat((Capture)null, parameters.Count - captures.Count)); } // pair up the parameters to the given arguments // provide default for parameters with missing arguments // throw an error if a missing argument is for a required parameter Dictionary<TagParameter, string> arguments = new Dictionary<TagParameter, string>(); foreach (var pair in parameters.Zip(captures, (p, c) => new { Capture = c, Parameter = p })) { string value = null; if (pair.Capture != null) { value = pair.Capture.Value; } else if (pair.Parameter.IsRequired) { string message = String.Format(Resources.WrongNumberOfArguments, definition.Name); throw new FormatException(message); } arguments.Add(pair.Parameter, value); } // indicate that a key/variable has been encountered // update the key/variable name ArgumentCollection collection = new ArgumentCollection(); foreach (var pair in arguments) { string placeholder = pair.Value; IArgument argument = null; if (placeholder != null) { if (placeholder.StartsWith("@")) { string variableName = placeholder.Substring(1); VariableFoundEventArgs args = new VariableFoundEventArgs(placeholder.Substring(1), String.Empty, String.Empty, false, context.ToArray()); if (VariableFound != null) { VariableFound(this, args); variableName = args.Name; } argument = new VariableArgument(variableName); } else if (RegexHelper.IsString(placeholder)) { string value = placeholder.Trim('\''); argument = new StringArgument(value); } else if (RegexHelper.IsNumber(placeholder)) { decimal number; if (Decimal.TryParse(placeholder, out number)) { argument = new NumberArgument(number); } } else { string placeholderName = placeholder; PlaceholderFoundEventArgs args = new PlaceholderFoundEventArgs(placeholder, String.Empty, String.Empty, false, context.ToArray()); if (PlaceholderFound != null) { PlaceholderFound(this, args); placeholderName = args.Key; } argument = new PlaceholderArgument(placeholderName); } } collection.AddArgument(pair.Key, argument); } return collection; }
private ArgumentCollection getArguments(TagDefinition definition, Match match, List <Context> context) { // make sure we don't have too many arguments List <Capture> captures = match.Groups["argument"].Captures.Cast <Capture>().ToList(); List <TagParameter> parameters = definition.Parameters.ToList(); if (captures.Count > parameters.Count) { string message = String.Format("The wrong number of arguments were passed to an {0} tag.", definition.Name); throw new FormatException(message); } // provide default values for missing arguments if (captures.Count < parameters.Count) { captures.AddRange(Enumerable.Repeat((Capture)null, parameters.Count - captures.Count)); } // pair up the parameters to the given arguments // provide default for parameters with missing arguments // throw an error if a missing argument is for a required parameter Dictionary <TagParameter, string> arguments = new Dictionary <TagParameter, string>(); foreach (var pair in parameters.Zip(captures, (p, c) => new { Capture = c, Parameter = p })) { string value = null; if (pair.Capture != null) { value = pair.Capture.Value; } else if (pair.Parameter.IsRequired) { string message = String.Format("The wrong number of arguments were passed to an {0} tag.", definition.Name); throw new FormatException(message); } arguments.Add(pair.Parameter, value); } // indicate that a key/variable has been encountered // update the key/variable name ArgumentCollection collection = new ArgumentCollection(); foreach (var pair in arguments) { string placeholder = pair.Value; IArgument argument = null; if (placeholder != null) { if (placeholder.StartsWith("@")) { string variableName = placeholder.Substring(1); VariableFoundEventArgs args = new VariableFoundEventArgs(placeholder.Substring(1), String.Empty, String.Empty, context.ToArray()); if (VariableFound != null) { VariableFound(this, args); variableName = args.Name; } argument = new VariableArgument(variableName); } else if (RegexHelper.IsString(placeholder)) { string value = placeholder.Trim('\''); argument = new StringArgument(value); } else if (RegexHelper.IsNumber(placeholder)) { decimal number; if (Decimal.TryParse(placeholder, out number)) { argument = new NumberArgument(number); } } else { string placeholderName = placeholder; PlaceholderFoundEventArgs args = new PlaceholderFoundEventArgs(placeholder, String.Empty, String.Empty, context.ToArray()); if (PlaceholderFound != null) { PlaceholderFound(this, args); placeholderName = args.Key; } argument = new PlaceholderArgument(placeholderName); } } collection.AddArgument(pair.Key, argument); } return(collection); }