You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.0 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Mapper
{
public class Pathfinder_Name : Pathfinder
{
public Pathfinder_Name(NameTypes t, params string[] Names)
: base()
{
nt = t;
_names = Names;
if((t & NameTypes.Regex) != NameTypes.None)
{
_regexString = new Regex[Names.Length];
for(int i = 0; i < Names.Length; i++)
{
if(string.IsNullOrEmpty(Names[i]))
continue;
try
{
_regexString[i] = new Regex(Names[i], (t & NameTypes.CaseInsensitive) != NameTypes.None ? RegexOptions.IgnoreCase : RegexOptions.None);
}
catch
{
// User entered invalid regex pattern
}
}
}
else if((t & NameTypes.CaseInsensitive) != NameTypes.None)
{
for(int i = 0; i < _names.Length; i++)
_names[i] = _names[i].ToLower();
}
}
private readonly Regex[] _regexString;
private readonly string[] _names;
private readonly NameTypes nt;
public override bool IsTargetRoom(Room r)
{
if(string.IsNullOrEmpty(r.Name))
return false;
if((nt & NameTypes.Regex) != NameTypes.None)
{
foreach(Regex x in _regexString)
{
if(x == null)
continue;
if(x.Match(r.Name).Success)
return true;
}
}
else
{
string rname = r.Name;
if((nt & NameTypes.CaseInsensitive) != NameTypes.None)
rname = rname.ToLower();
foreach(string x in _names)
{
if((nt & NameTypes.Partial) != NameTypes.None)
{
if(rname.Contains(x))
return true;
}
else if(rname == x)
return true;
}
}
return false;
}
}
[Flags]
public enum NameTypes
{
/// <summary>
/// Exact name search. Room name must match what you entered and case sensitive.
/// </summary>
None = 0,
/// <summary>
/// Room name must contain the string you entered. This setting is ignored if you set regex option.
/// </summary>
Partial = 1,
/// <summary>
/// Room name vs. what you entered is not case sensitive.
/// </summary>
CaseInsensitive = 2,
/// <summary>
/// You entered a regex string which must match room name.
/// </summary>
Regex = 4,
}
}