public string Decompose(string compositionName, string value) { var composition = this.compositionProvider.GetComposition(compositionName); var textParts = new TextParts(composition); var stringParts = this.GetStringParts(textParts, new[] { String.Empty }); var collection = textParts.Parts.Select((part, idx) => new { Part = part, Parameters = stringParts[idx], Index = idx }).ToArray(); var index = 0; foreach (var set in collection) { if (set.Part.Parts.Any(str => str.Equals("$"))) break; index++; var subPart = set.Parameters.Where(value.StartsWith).Aggregate(String.Empty, (current, part) => part.Length > current.Length ? part : current); value = value.Substring(subPart.Length); } foreach (var set in collection.Skip(index).Reverse()) { var subPart = set.Parameters.Where(value.EndsWith).Aggregate(String.Empty, (current, part) => part.Length > current.Length ? part : current); value = value.Substring(0, value.Length - subPart.Length); } return value; }
private string[][] GetStringParts(TextParts textParts, IEnumerable<string> looseParameters) { return textParts.Parts.Select( textPart => textPart.IsParameter ? this.GetParametersWithPart(textPart, looseParameters).ToArray() : textPart.Parts).ToArray(); }
private IEnumerable<string> GetCompositionStrings(string composition, IEnumerable<string> looseParameters) { var textParts = new TextParts(composition); var stringParts = this.GetStringParts(textParts, looseParameters); // ReSharper disable once CoVariantArrayConversion return Compose(stringParts); }