using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
Console.WriteLine("Hello World");
public FreemarkerTagEntity ExtractTags(string content, string entityName)
FreemarkerTagEntity entityTag = new FreemarkerTagEntity() { EntityName = entityName };
var validfieldNameRegex = new Regex(@"^(\w|_|:)(\w|\d|\.|-|_|:)*$");
Regex r = new Regex(string.Format("Recipient.{0}.", entityName));
Match m = r.Match(content);
int startIndex = m.Index;
List<int> iEnds = new List<int>();
iEnds.Add(content.IndexOf(".@value[0]", startIndex));
iEnds.Add(content.IndexOf("[0]", startIndex));
iEnds.Add(content.IndexOf("}", startIndex));
iEnds.Add(content.IndexOf("!", startIndex));
iEnds.Add(content.IndexOf("?", startIndex));
iEnds.Add(content.IndexOf(" ", startIndex));
while (iEnds.Contains(-1)) iEnds.Remove(-1);
if (endIndex > startIndex)
string[] tag = content.Substring(startIndex, endIndex - startIndex).Split('.');
if (!entityTag.Tags.Contains(tag[2]) && validfieldNameRegex.IsMatch(tag[2]))
entityTag.Tags.Add(tag[2]);
else if (tag.Length == 5)
if (entityTag.LookupTags.GetTagEntity(tag[3]) == null)
entityTag.LookupTags.Add(new FreemarkerTagEntity() { EntityName = tag[3], LookupField = tag[2] });
if (!entityTag.LookupTags.GetTagEntity(tag[3]).Tags.Contains(tag[4]) && validfieldNameRegex.IsMatch(tag[4]))
entityTag.LookupTags.GetTagEntity(tag[3]).Tags.Add(tag[4]);
public class FreemarkerTagEntity : IEquatable<FreemarkerTagEntity>
public string EntityName { get; set; }
public string LookupField { get; set; }
public FreemarkerTagEntityCollection LookupTags { get; set; }
public List<string> Tags { get; set; }
public FreemarkerTagEntity()
EntityName = string.Empty;
Tags = new List<string>();
LookupTags = new FreemarkerTagEntityCollection();
LookupField = string.Empty;
public bool Equals(FreemarkerTagEntity other)
return this.EntityName.Equals(other.EntityName);
public void Merge(FreemarkerTagEntity other)
Tags = Tags.Union(other.Tags).Distinct().ToList();
foreach (var ot in other.LookupTags)
if (this.LookupTags.GetTagEntity(ot.EntityName) == null)
this.LookupTags.GetTagEntity(ot.EntityName).Tags = this.LookupTags.GetTagEntity(ot.EntityName).Tags.Union(ot.Tags).Distinct().ToList();
public class FreemarkerTagEntityCollection : List<FreemarkerTagEntity>
public FreemarkerTagEntity GetTagEntity(string entityName)
return this.Find(delegate (FreemarkerTagEntity e) { return e.EntityName.Equals(entityName); });