1using System.Collections.Generic;
2using System.Text.RegularExpressions;
12 private readonly Dictionary<string, MappingExpression> mappings =
new Dictionary<string, MappingExpression>();
13 private MappingStep mappingsStep0 =
null;
14 private bool hasMaps =
false;
47 if (!this.mappings.TryGetValue(RegexPattern, out MappingExpression Exp))
49 Exp =
new MappingExpression()
51 Pattern = RegexPattern,
52 Expression =
new Regex(RegexPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant),
55 this.mappings[RegexPattern] = Exp;
58 Dictionary<string, bool> Names =
new Dictionary<string, bool>();
60 foreach (
string Name
in Exp.Expression.GetGroupNames())
63 List<KeyValuePair<int, string>> Parameters =
new List<KeyValuePair<int, string>>();
64 int i = MapTo.IndexOf(
'{');
69 j = MapTo.IndexOf(
'}', i + 1);
73 string Name = MapTo.Substring(i + 1, j - i - 1);
75 if (Names.ContainsKey(Name))
77 Parameters.Add(
new KeyValuePair<int, string>(i, Name));
78 MapTo = MapTo.Remove(i, j - i + 1);
79 i = MapTo.IndexOf(
'{', i);
82 i = MapTo.IndexOf(
'{', i + 1);
88 Exp.Parameters = Parameters.ToArray();
91 this.mappingsStep0 =
null;
104 if (this.mappings.Remove(RegexPattern))
106 this.hasMaps = this.mappings.Count > 0;
107 this.mappingsStep0 =
null;
125 LinkedList<string> ToRemove =
null;
130 foreach (KeyValuePair<string, MappingExpression> P
in this.mappings)
132 if (!(P.Value.Tag is
null) && P.Value.Tag.Equals(Tag))
134 if (ToRemove is
null)
135 ToRemove =
new LinkedList<string>();
137 ToRemove.AddLast(P.Key);
141 if (!(ToRemove is
null))
143 foreach (
string Key
in ToRemove)
145 if (this.mappings.Remove(Key))
160 public bool TryMap(
string InputString, out
string Harmonized)
166 MappingStep
Step = this.mappingsStep0;
172 MappingExpression[] Expressions;
176 Expressions =
new MappingExpression[this.mappings.Count];
177 this.mappings.Values.CopyTo(Expressions, 0);
180 Step = this.mappingsStep0 = MappingStep.CalcStep((
char)0, Expressions);
183 foreach (
char ch
in InputString)
185 if (!(
Step.Expressions is
null))
187 foreach (Mapping Map
in Step.Expressions)
189 Match M = Map.Expression.Match(InputString);
190 if (M.Success && M.Index == 0 && M.Length == InputString.Length)
192 Harmonized = Map.MapSeed;
193 foreach (KeyValuePair<int, string> P
in Map.Parameters)
194 Harmonized = Harmonized.Insert(P.Key, M.Groups[P.Value]?.Value ??
string.Empty);
201 if (
Step.Next is
null)
206 foreach (MappingStep Step2
in Step.Next)
208 ch2 = Step2.Character;
224 if (!(
Step.Next is
null))
227 if (!(
Step.Expressions is
null))
229 foreach (Mapping Map
in Step.Expressions)
231 Match M = Map.Expression.Match(InputString);
232 if (M.Success && M.Index == 0 && M.Length == InputString.Length)
234 Harmonized = Map.MapSeed;
235 foreach (KeyValuePair<int, string> P
in Map.Parameters)
236 Harmonized = Harmonized.Insert(P.Key, M.Groups[P.Value]?.Value ??
string.Empty);
247 private class Mapping
249 public Regex Expression;
250 public string MapSeed;
251 public KeyValuePair<int, string>[] Parameters;
254 private class MappingExpression
256 public string Pattern;
257 public Regex Expression;
258 public string MapSeed;
259 public KeyValuePair<int, string>[] Parameters;
263 private class MappingStep
265 public char Character;
266 public MappingStep[] Next;
267 public Mapping[] Expressions;
269 internal static MappingStep CalcStep(
char Character, MappingExpression[] Expressions)
271 SortedDictionary<char, List<MappingExpression>> Next =
new SortedDictionary<char, List<MappingExpression>>();
272 List<Mapping> Maps =
null;
273 List<MappingStep> Steps =
null;
275 foreach (MappingExpression Exp
in Expressions)
277 if (
string.IsNullOrEmpty(Exp.Pattern))
278 AddMap(ref Maps, Exp);
281 char ch = Exp.Pattern[0];
283 if (
"\\^$.|?*+()[{".IndexOf(ch) >= 0)
284 AddMap(ref Maps, Exp);
287 if (!Next.TryGetValue(ch, out List<MappingExpression> List))
289 List =
new List<MappingExpression>();
293 List.Add(
new MappingExpression()
295 Pattern = Exp.Pattern.Substring(1),
296 Expression = Exp.Expression,
297 MapSeed = Exp.MapSeed,
298 Parameters = Exp.Parameters,
305 foreach (KeyValuePair<
char, List<MappingExpression>> P
in Next)
308 Steps =
new List<MappingStep>();
310 Steps.Add(CalcStep(P.Key, P.Value.ToArray()));
313 return new MappingStep()
315 Character = Character,
316 Next = Steps?.ToArray(),
317 Expressions = Maps?.ToArray()
321 private static void AddMap(ref List<Mapping> Maps, MappingExpression Exp)
324 Maps =
new List<Mapping>();
326 Maps.Add(
new Mapping()
328 Expression = Exp.Expression,
329 MapSeed = Exp.MapSeed,
330 Parameters = Exp.Parameters
336 return new string(this.Character, 1);
Maps strings of text to a harmonized set of strings using collections of regular expressions and para...
int UnregisterMappings(object Tag)
Unregisters mappings tagged with a specific object.
void RegisterMapping(string RegexPattern, string MapTo)
Registers a mapping.
bool TryMap(string InputString, out string Harmonized)
Tries to map a string using registered mappings.
void RegisterMapping(string RegexPattern, string MapTo, object Tag)
Registers a mapping.
HarmonizedTextMap()
Maps strings of text to a harmonized set of strings using collections of regular expressions and para...
bool UnregisterMapping(string RegexPattern)
Unregisters a mapping.
Represents a sub-sequence of symbols.
delegate string ToString(IElement Element)
Delegate for callback methods that convert an element value to a string.