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.