/// <summary> /// Resolves the naming-pattern functions /// </summary> /// <returns></returns> private static string ResolveFunction(Match m, NamePatternParameters parameters) { // function parameters can be non numeric if numbers are parsed try { if (!parameters.ProcessNumberField && m.Groups[2].Value.Contains("{n}")) { return(m.Groups[0].Value); } return(NamePatternFunctions.ResolveFunction(m, parameters)); } catch (Exception ex) { MessageBoxes.ExceptionMessageBox(ex, $"The syntax of the following pattern function\n{m.Groups[0].Value}\ncannot be processed and will be ignored.", "Naming pattern function error"); } return(string.Empty); }
/// <summary> /// Resolves functions in the pattern. /// A function expression looks like {{#function_name:{xxx}|2|3}}, e.g. {{#substring:{HP}|2|3}} /// </summary> /// <param name="pattern"></param> /// <param name="creature"></param> /// <param name="customReplacings">Dictionary of user defined replacings</param> /// <param name="displayError">If true, a MessageBox with the error will be displayed.</param> /// <param name="processNumberField">If true, the {n} will be processed</param> /// <returns></returns> private static string ResolveFunctions(string pattern, Creature creature, Dictionary <string, string> customReplacings, bool displayError, bool processNumberField) { int nrFunctions = 0; int nrFunctionsAfterResolving = NrFunctions(pattern); // the second and third parameter are optional Regex r = new Regex(@"\{\{ *#(\w+) *: *([^\|\{\}]*?) *(?:\| *([^\|\{\}]*?) *)?(?:\| *([^\|\{\}]*?) *)?\}\}", RegexOptions.IgnoreCase); var parameters = new NamePatternParameters { Creature = creature, CustomReplacings = customReplacings, DisplayError = displayError, ProcessNumberField = processNumberField }; // resolve nested functions while (nrFunctions != nrFunctionsAfterResolving) { nrFunctions = nrFunctionsAfterResolving; pattern = r.Replace(pattern, (m) => ResolveFunction(m, parameters)); nrFunctionsAfterResolving = NrFunctions(pattern); } return(pattern); int NrFunctions(string p) { int nr = 0; foreach (char c in p) { if (c == '#') { nr++; } } return(nr); } }