|
|
|
|
|
|
using System; |
|
|
|
using System; |
|
|
|
using System.Text.RegularExpressions; |
|
|
|
using UnityEditor.Graphing; |
|
|
|
using UnityEditor.Graphing.Util; |
|
|
|
using UnityEngine; |
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return s_LegacyTypeRemapping; |
|
|
|
} |
|
|
|
|
|
|
|
// Sanitize a name to not conflict with other names.
|
|
|
|
// `existingNames` is the collection of names that the sanitized name should not collide with.
|
|
|
|
// `duplicateFormat` is the format applied to handle cases with overlapping names. The string supplied should
|
|
|
|
// be a formattable string where the first argument is the base name, and the second argument the
|
|
|
|
// `duplication number`.
|
|
|
|
// An example of input ({"name", "name (1)"}, "{0} ({1})", name) should yield the output "name (2)".
|
|
|
|
public static string SanitizeName(IEnumerable<string> existingNames, string duplicateFormat, string name) |
|
|
|
{ |
|
|
|
if (!existingNames.Contains(name)) |
|
|
|
return name; |
|
|
|
|
|
|
|
string escapedDuplicateFormat = Regex.Escape(duplicateFormat); |
|
|
|
|
|
|
|
// Escaped format will escape string interpolation, so the escape caracters must be removed for these.
|
|
|
|
escapedDuplicateFormat = escapedDuplicateFormat.Replace(@"\{0}", @"{0}"); |
|
|
|
escapedDuplicateFormat = escapedDuplicateFormat.Replace(@"\{1}", @"{1}"); |
|
|
|
|
|
|
|
var baseRegex = new Regex(string.Format(escapedDuplicateFormat, @"^(.*)", @"(\d+)")); |
|
|
|
|
|
|
|
var baseMatch = baseRegex.Match(name); |
|
|
|
if (baseMatch.Success) |
|
|
|
name = baseMatch.Groups[1].Value; |
|
|
|
|
|
|
|
string baseNameExpression= string.Format(@"^{0}", Regex.Escape(name)); |
|
|
|
var regex = new Regex(string.Format(escapedDuplicateFormat, baseNameExpression, @"(\d+)") + "$"); |
|
|
|
|
|
|
|
var existingDuplicateNumbers = existingNames.Select(existingName => regex.Match(existingName)).Where(m => m.Success).Select(m => int.Parse(m.Groups[1].Value)).Where(n => n > 0).Distinct().ToList(); |
|
|
|
|
|
|
|
var duplicateNumber = 1; |
|
|
|
existingDuplicateNumbers.Sort(); |
|
|
|
if (existingDuplicateNumbers.Any() && existingDuplicateNumbers.First() == 1) |
|
|
|
{ |
|
|
|
duplicateNumber = existingDuplicateNumbers.Last() + 1; |
|
|
|
for (var i = 1; i < existingDuplicateNumbers.Count; i++) |
|
|
|
{ |
|
|
|
if (existingDuplicateNumbers[i - 1] != existingDuplicateNumbers[i] - 1) |
|
|
|
{ |
|
|
|
duplicateNumber = existingDuplicateNumbers[i - 1] + 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return string.Format(duplicateFormat, name, duplicateNumber); |
|
|
|
} |
|
|
|
} |
|
|
|
} |