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);
}