private void BuildRules(List<Rule> rules, string[] lines)
{
foreach (string line in lines)
{
string workingLine = line.Trim();
if (workingLine.StartsWith("#") || workingLine.Length == 0)
continue;
Rule r;
r.exclude = !workingLine.StartsWith("!");
if (!r.exclude)
workingLine = workingLine.Substring(1);
r.isDirectoryOnly = !workingLine.Contains(".");
const string regexCharMatch = @"[^/\\]";
StringBuilder pattern = new StringBuilder();
int i = 0;
if (workingLine[0] == '/')
{
pattern.Append("^/");
i++;
}
else
{
pattern.Append("/");
}
for (; i < workingLine.Length; i++)
{
switch (workingLine[i])
{
case '?':
pattern.Append(regexCharMatch).Append("?");
break;
case '\\':
i++;
pattern.Append("\\");
break;
case '*':
pattern.Append(regexCharMatch).Append("*");
break;
case '[':
for (; i < workingLine.Length && workingLine[i] != ']'; i++)
{
if (i == 0 && workingLine[i] == '!')
pattern.Append("^");
else
pattern.Append(workingLine[i]);
}
pattern.Append(workingLine[i]);
break;
case '.':
pattern.Append("\\.");
break;
default:
pattern.Append(workingLine[i]);
break;
}
}
if (!r.isDirectoryOnly)
{
pattern.Append("$");
}
r.pattern = new System.Text.RegularExpressions.Regex(pattern.ToString());
rules.Add(r);
}
}