public string Transform(Topic current, string before) { var tokens = Token.FindTokens(before).ToArray(); if (!tokens.Any()) { return(before); } var builder = new StringBuilder(); var position = 0; tokens.Each(token => { if (token.FirstIndex > position) { builder.Append(before.Substring(position, token.FirstIndex - position)); } var handler = _handlers[token.Key]; builder.Append(handler.Transform(current, token.Data)); position = token.LastIndex + 1; }); if (position < before.Length) { builder.Append(before.Substring(position)); } return(builder.ToString()); }