4 using System.Collections.Generic;
7 using System.Text.RegularExpressions;
8 using SiliconStudio.Core;
9 using SiliconStudio.Core.Serialization.Assets;
11 namespace SiliconStudio.Assets.Selectors
16 [DataContract(
"PathSelector")]
19 private KeyValuePair<string, Regex>[] regexes;
23 Paths =
new List<string>();
32 public List<string> Paths {
get; set; }
38 bool needGenerateRegex =
false;
39 if (regexes == null || regexes.Length != Paths.Count)
41 needGenerateRegex =
true;
46 for (
int i = 0; i < Paths.Count; ++i)
48 if (Paths[i] != regexes[i].Key)
50 needGenerateRegex =
true;
57 if (needGenerateRegex)
58 regexes = Paths.Select(x =>
new KeyValuePair<string, Regex>(x,
new Regex(TransformToRegex(x)))).ToArray();
60 return assetIndexMap.GetMergedIdMap()
61 .Select(asset => asset.Key)
62 .Where(assetUrl => regexes.Any(regex => regex.Value.IsMatch(assetUrl)));
65 internal static string TransformToRegex(
string pattern)
68 var result =
new StringBuilder(pattern.Length + pattern.Length / 2);
70 int startPosition = 0;
72 if (pattern.Length > 0 && pattern[0] ==
'/')
81 result.Append(
@"(^|/)");
84 for (
int i = startPosition; i < pattern.Length; ++i)
91 result.Append(
"[^/]*");
95 result.Append(
"[^/]");
99 if (++i < pattern.Length)
105 throw new NotImplementedException(
"Can't match pattern that uses '['");
107 result.Append(Regex.Escape(c.ToString()));
113 if (pattern.Length > 0 && pattern[pattern.Length - 1] !=
'/')
115 result.Append(
@"($|/)");
117 return result.ToString();
Matches asset depending on their URL, using a gitignore-like format (based on fnmatch()).
override IEnumerable< string > Select(PackageSession packageSession, IAssetIndexMap assetIndexMap)
A session for editing a package.