TextTemplateParser.BlockNode TextNode(EmailTemplateMessageEmbedded message) { if (message.TextParsedNode == null) { string body = message.Text; if (template.MasterTemplate != null) { var emt = template.MasterTemplate.RetrieveAndRemember(); var emtm = emt.GetCultureMessage(message.CultureInfo.ToCultureInfo()) ?? emt.GetCultureMessage(message.CultureInfo.ToCultureInfo().Parent) ?? emt.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo()) ?? emt.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo().Parent); if (emtm != null) { body = EmailMasterTemplateEntity.MasterTemplateContentRegex.Replace(emtm.Text, m => body); } } message.TextParsedNode = TextTemplateParser.Parse(body, qd, template.Model?.ToType()); } return((TextTemplateParser.BlockNode)message.TextParsedNode); }
static void Newsletter_PreSaving(NewsletterEntity newsletter, PreSavingContext ctx) { var queryname = QueryLogic.ToQueryName(newsletter.Query !.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryname); newsletter.Subject = TextTemplateParser.Parse(newsletter.Subject, qd, null).ToString(); newsletter.Text = TextTemplateParser.Parse(newsletter.Text, qd, null).ToString(); }
public void Execute(ExecutingProcess executingProcess) { NewsletterEntity newsletter = (NewsletterEntity)executingProcess.Data !; var queryName = QueryLogic.ToQueryName(newsletter.Query !.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryName); List <QueryToken> list = new List <QueryToken>(); using (ExecutionMode.Global()) { list.Add(QueryUtils.Parse("Entity", qd, 0)); list.Add(QueryUtils.Parse(".".Combine("Entity", "NewsletterDeliveries", "Element"), qd, SubTokensOptions.CanElement)); list.Add(QueryUtils.Parse(".".Combine("Entity", "EmailOwnerData"), qd, 0)); TextTemplateParser.Parse(newsletter.Subject, qd, null).FillQueryTokens(list); TextTemplateParser.Parse(newsletter.Text, qd, null).FillQueryTokens(list); list = list.Distinct().ToList(); } var columns = list.Select(qt => new Column(qt, null)).ToList(); //var columns = new List<QueryToken>(); //columns.Add(QueryUtils.Parse("Entity.NewsletterDeliveries.Element", qd, canAggregate: false)); //columns.Add(QueryUtils.Parse("Entity.Email", qd, canAggregate: false)); //columns.AddRange(NewsletterLogic.GetTokens(queryName, newsletter.Subject)); //columns.AddRange(NewsletterLogic.GetTokens(queryName, newsletter.Text)); columns = columns.Distinct().ToList(); var resultTable = QueryLogic.Queries.ExecuteQuery(new QueryRequest { QueryName = queryName, Filters = new List <Filter> { new FilterCondition(QueryUtils.Parse("Entity.NewsletterDeliveries.Element.Newsletter", qd, SubTokensOptions.CanElement), FilterOperation.EqualTo, newsletter.ToLite()), new FilterCondition(QueryUtils.Parse("Entity.NewsletterDeliveries.Element.Sent", qd, SubTokensOptions.CanElement), FilterOperation.EqualTo, false), }, Orders = new List <Order>(), Columns = columns, Pagination = new Pagination.All(), }); var dicTokenColumn = resultTable.Columns.ToDictionary(rc => rc.Column.Token); var entityColumn = resultTable.Columns.SingleEx(c => c.Column.Token.FullKey() == "Entity"); var deliveryColumn = resultTable.Columns.SingleEx(c => c.Column.Token.FullKey() == "Entity.NewsletterDeliveries.Element"); var emailOwnerColumn = resultTable.Columns.SingleEx(c => c.Column.Token.FullKey() == "Entity.EmailOwnerData"); var lines = resultTable.Rows.GroupBy(r => (Lite <Entity>)r[entityColumn] !).Select(g => new SendLine { NewsletterDelivery = (Lite <NewsletterDeliveryEntity>)g.DistinctSingle(deliveryColumn) !, Email = (EmailOwnerData)g.DistinctSingle(emailOwnerColumn) !, Rows = g, }).ToList();
TextTemplateParser.BlockNode SubjectNode(EmailTemplateMessageEmbedded message) { if (message.SubjectParsedNode == null) { message.SubjectParsedNode = TextTemplateParser.Parse(message.Subject, qd, template.Model?.ToType()); } return((TextTemplateParser.BlockNode)message.SubjectParsedNode); }
private static string GetTemplateString(string?title, ref object?titleNode, EmailTemplateLogic.GenerateAttachmentContext ctx) { var block = titleNode != null ? (TextTemplateParser.BlockNode)titleNode : (TextTemplateParser.BlockNode)(titleNode = TextTemplateParser.Parse(title, ctx.QueryDescription, ctx.ModelType)); return(block.Print(new TextTemplateParameters(ctx.Entity, ctx.Culture, ctx.ResultColumns, ctx.CurrentRows) { Model = ctx.Model })); }
public static TextTemplateParser.BlockNode ParseTemplate(EmailTemplateEntity template, string?text, out string errorMessage) { using (template.DisableAuthorization ? ExecutionMode.Global() : null) { object queryName = QueryLogic.ToQueryName(template.Query.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryName); List <QueryToken> list = new List <QueryToken>(); return(TextTemplateParser.TryParse(text, qd, template.Model?.ToType(), out errorMessage)); } }
public static void Start(SchemaBuilder sb) { sb.Include <ExcelAttachmentEntity>() .WithQuery(() => s => new { Entity = s, s.Id, s.FileName, s.UserQuery, s.Related, }); EmailTemplateLogic.FillAttachmentTokens.Register((ExcelAttachmentEntity ea, EmailTemplateLogic.FillAttachmentTokenContext ctx) => { if (ea.FileName != null) { TextTemplateParser.Parse(ea.FileName, ctx.QueryDescription, ctx.ModelType).FillQueryTokens(ctx.QueryTokens); } if (ea.Title != null) { TextTemplateParser.Parse(ea.Title, ctx.QueryDescription, ctx.ModelType).FillQueryTokens(ctx.QueryTokens); } }); Validator.PropertyValidator((ExcelAttachmentEntity e) => e.FileName).StaticPropertyValidation = ExcelAttachmentFileName_StaticPropertyValidation; Validator.PropertyValidator((ExcelAttachmentEntity e) => e.Title).StaticPropertyValidation = ExcelAttachmentTitle_StaticPropertyValidation; EmailTemplateLogic.GenerateAttachment.Register((ExcelAttachmentEntity ea, EmailTemplateLogic.GenerateAttachmentContext ctx) => { var finalEntity = ea.Related?.RetrieveAndRemember() ?? (Entity?)ctx.Entity ?? ctx.Model !.UntypedEntity as Entity; using (finalEntity == null ? null : CurrentEntityConverter.SetCurrentEntity(finalEntity)) using (CultureInfoUtils.ChangeBothCultures(ctx.Culture)) { QueryRequest request = UserQueryLogic.ToQueryRequest(ea.UserQuery.RetrieveAndRemember()); var title = GetTemplateString(ea.Title, ref ea.TitleNode, ctx); var fileName = GetTemplateString(ea.FileName, ref ea.FileNameNode, ctx); var bytes = ExcelLogic.ExecutePlainExcel(request, title); return(new List <EmailAttachmentEmbedded> { new EmailAttachmentEmbedded { File = Files.FilePathEmbeddedLogic.SaveFile(new Entities.Files.FilePathEmbedded(EmailFileType.Attachment, fileName, bytes)), Type = EmailAttachmentType.Attachment, } }); } }); }
public static void Start(SchemaBuilder sb) { sb.Include <WordAttachmentEntity>() .WithQuery(() => s => new { Entity = s, s.Id, s.FileName, s.WordTemplate, s.OverrideModel, }); EmailTemplateLogic.FillAttachmentTokens.Register((WordAttachmentEntity wa, EmailTemplateLogic.FillAttachmentTokenContext ctx) => { if (wa.FileName != null) { TextTemplateParser.Parse(wa.FileName, ctx.QueryDescription, ctx.ModelType).FillQueryTokens(ctx.QueryTokens); } }); Validator.PropertyValidator((WordAttachmentEntity e) => e.FileName).StaticPropertyValidation = WordAttachmentFileName_StaticPropertyValidation; EmailTemplateLogic.GenerateAttachment.Register((WordAttachmentEntity wa, EmailTemplateLogic.GenerateAttachmentContext ctx) => { var entity = wa.OverrideModel?.RetrieveAndRemember() ?? (Entity?)ctx.Entity ?? ctx.Model !.UntypedEntity; if (wa.ModelConverter != null) { entity = wa.ModelConverter.Convert(entity); } using (CultureInfoUtils.ChangeBothCultures(ctx.Culture)) { WordTemplateEntity template = WordTemplateLogic.GetFromCache(wa.WordTemplate); var fileName = GetTemplateString(wa.FileName, ref wa.FileNameNode, ctx); var model = template.Model != null && !WordModelLogic.RequiresExtraParameters(template.Model) ? WordModelLogic.CreateDefaultWordModel(template.Model, entity) : null; var bytes = WordTemplateLogic.CreateReport(template, entity, model); return(new List <EmailAttachmentEmbedded> { new EmailAttachmentEmbedded { File = Files.FilePathEmbeddedLogic.SaveFile(new Entities.Files.FilePathEmbedded(EmailFileType.Attachment, fileName, bytes)), Type = EmailAttachmentType.Attachment, } }); } }); }
static void EmailTemplate_PreSaving(SMSTemplateEntity smsTemplate, PreSavingContext ctx) { using (smsTemplate.DisableAuthorization ? ExecutionMode.Global() : null) { var queryName = QueryLogic.ToQueryName(smsTemplate.Query.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryName); List <QueryToken> list = new List <QueryToken>(); foreach (var message in smsTemplate.Messages) { message.Message = TextTemplateParser.Parse(message.Message, qd, smsTemplate.Model?.ToType()).ToString(); } } }
static string?ValidateTokens(NewsletterEntity newsletter, string?text) { var queryName = QueryLogic.ToQueryName(newsletter.Query !.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryName); try { TextTemplateParser.TryParse(text, qd, null, out string error); return(error.DefaultToNull()); } catch (Exception e) { return(e.Message); } }
public static SMSMessageEntity CreateSMSMessage(Lite <SMSTemplateEntity> template, Entity?entity, ISMSModel?model, CultureInfo?forceCulture) { var t = SMSLogic.SMSTemplatesLazy.Value.GetOrThrow(template); var defaultCulture = SMSLogic.Configuration.DefaultCulture.ToCultureInfo(); if (t.Query != null) { var qd = QueryLogic.Queries.QueryDescription(t.Query.ToQueryName()); List <QueryToken> tokens = new List <QueryToken>(); t.ParseData(qd); tokens.Add(t.To !.Token); var parsedNodes = t.Messages.ToDictionary( tm => tm.CultureInfo.ToCultureInfo(), tm => TextTemplateParser.Parse(tm.Message, qd, t.Model?.ToType()) ); parsedNodes.Values.ToList().ForEach(n => n.FillQueryTokens(tokens)); var columns = tokens.Distinct().Select(qt => new Column(qt, null)).ToList(); var filters = model != null?model.GetFilters(qd) : new List <Filter> { new FilterCondition(QueryUtils.Parse("Entity", qd, 0), FilterOperation.EqualTo, entity !.ToLite()) }; var table = QueryLogic.Queries.ExecuteQuery(new QueryRequest { QueryName = qd.QueryName, Columns = columns, Pagination = model?.GetPagination() ?? new Pagination.All(), Filters = filters, Orders = model?.GetOrders(qd) ?? new List <Order>(), }); var columnTokens = table.Columns.ToDictionary(a => a.Column.Token); var ownerData = (SMSOwnerData)table.Rows[0][columnTokens.GetOrThrow(t.To !.Token)] !;
public static void Start(SchemaBuilder sb) { sb.Settings.AssertImplementedBy((EmailTemplateEntity e) => e.Attachments.First(), typeof(ImageAttachmentEntity)); sb.Include <ImageAttachmentEntity>() .WithQuery(() => s => new { Entity = s, s.Id, s.FileName, s.ContentId }); Validator.PropertyValidator((ImageAttachmentEntity e) => e.FileName).StaticPropertyValidation = ImageAttachmentFileName_StaticPropertyValidation; EmailTemplateLogic.FillAttachmentTokens.Register((ImageAttachmentEntity wa, EmailTemplateLogic.FillAttachmentTokenContext ctx) => { if (wa.FileName != null) { TextTemplateParser.Parse(wa.FileName, ctx.QueryDescription, ctx.ModelType).FillQueryTokens(ctx.QueryTokens); } }); EmailTemplateLogic.GenerateAttachment.Register((ImageAttachmentEntity a, EmailTemplateLogic.GenerateAttachmentContext ctx) => { using (CultureInfoUtils.ChangeBothCultures(ctx.Culture)) { var fileName = !a.FileName.HasText() ? a.File.FileName : GetTemplateString(a.FileName, ref a.FileNameNode, ctx); return(new List <EmailAttachmentEmbedded> { new EmailAttachmentEmbedded { File = new FilePathEmbedded(EmailFileType.Attachment, fileName, a.File.BinaryFile), Type = a.Type, ContentId = a.ContentId, } }); } }); }
internal static SqlPreCommand?ProcessEmailTemplate(Replacements replacements, Table table, EmailTemplateEntity et, StringDistance sd) { Console.Write("."); try { var queryName = QueryLogic.ToQueryName(et.Query.Key); QueryDescription qd = QueryLogic.Queries.QueryDescription(queryName); using (DelayedConsole.Delay(() => SafeConsole.WriteLineColor(ConsoleColor.White, "EmailTemplate: " + et.Name))) using (DelayedConsole.Delay(() => Console.WriteLine(" Query: " + et.Query.Key))) { if (et.From != null && et.From.Token != null) { QueryTokenEmbedded token = et.From.Token; switch (QueryTokenSynchronizer.FixToken(replacements, ref token, qd, SubTokensOptions.CanElement, " From", allowRemoveToken: false, allowReCreate: et.Model != null)) { case FixTokenResult.Nothing: break; case FixTokenResult.DeleteEntity: return(table.DeleteSqlSync(et, e => e.Name == et.Name)); case FixTokenResult.SkipEntity: return(null); case FixTokenResult.Fix: et.From.Token = token; break; case FixTokenResult.ReGenerateEntity: return(Regenerate(et, replacements, table)); default: break; } } if (et.Recipients.Any(a => a.Token != null)) { using (DelayedConsole.Delay(() => Console.WriteLine(" Recipients:"))) { foreach (var item in et.Recipients.Where(a => a.Token != null).ToList()) { QueryTokenEmbedded token = item.Token !; switch (QueryTokenSynchronizer.FixToken(replacements, ref token, qd, SubTokensOptions.CanElement, " Recipient", allowRemoveToken: false, allowReCreate: et.Model != null)) { case FixTokenResult.Nothing: break; case FixTokenResult.DeleteEntity: return(table.DeleteSqlSync(et, e => e.Name == et.Name)); case FixTokenResult.RemoveToken: et.Recipients.Remove(item); break; case FixTokenResult.SkipEntity: return(null); case FixTokenResult.Fix: item.Token = token; break; case FixTokenResult.ReGenerateEntity: return(Regenerate(et, replacements, table)); default: break; } } } } try { foreach (var item in et.Messages) { SynchronizationContext sc = new SynchronizationContext(replacements, sd, qd, et.Model?.ToType()); item.Subject = TextTemplateParser.Synchronize(item.Subject, sc); item.Text = TextTemplateParser.Synchronize(item.Text, sc); } using (replacements.WithReplacedDatabaseName()) return(table.UpdateSqlSync(et, e => e.Name == et.Name, includeCollections: true, comment: "EmailTemplate: " + et.Name)); } catch (TemplateSyncException ex) { if (ex.Result == FixTokenResult.SkipEntity) { return(null); } if (ex.Result == FixTokenResult.DeleteEntity) { return(table.DeleteSqlSync(et, e => e.Name == et.Name)); } if (ex.Result == FixTokenResult.ReGenerateEntity) { return(Regenerate(et, replacements, table)); } throw new UnexpectedValueException(ex.Result); } } } catch (Exception e) { return(new SqlPreCommandSimple("-- Exception on {0}. {1}\r\n{2}".FormatWith(et.BaseToString(), e.GetType().Name, e.Message.Indent(2, '-')))); } }
private static void Main(string[] args) { //try //{ string input; //input = @"{'{""hello"":""world""}':[{""hello""} {hello}]}"; input = @"// data context: {'{""firstName"": ""Robert"", ""lastName"": ""Smith"", ""pets"":[ {""type"":""dog"", ""name"": ""Toto""} ,{""type"":""cat"", ""name"": ""Dolly""} ,{""type"":""zebra"", ""name"": ""Stripes""} ]}': // Template: [{""Hello""} {lastName}, {firstName} with {pets=> [{pets:#formatPet.#anded()}] ,[no pets] }!!]} Subtemplates: {#formatPet:[a {type} named {name}]} {#anded:[{$0.Join(', ',' and ')}]}"; input = @"People:{#data:[ {.} {[{ lastName}{ firstName.#Prepend(', ')}{ middleName.#Prepend(' ') }].ToUpper().#Quoted()} {.} Lastname: {lastName.IfMissing('No Last Name')} {.} FirstName: {firstName} {.} Pets {pets=>[({pets.Count()}): {.} Domesticated ({pets.#Domesticated().Count()}): {.} {pets.#Domesticated():[{#formatPet} #{*.Index()}]} {.} Non-domesticated ({pets.#NonDomesticated().Count()}): {.} {pets.#NonDomesticated():[{#formatPet} #{*.Index()}]} ],[no pets] } // ].@MissingValue('No Information Provided')} Subtemplates: {#formatPet:[ a {type.Case('zebra',[{[{name}y].ToLower()}],'dog','friskie','cat','fishy','nice')} ` {type} named {name} ]} {#Domesticated: [{$0.Where(type.#IsDomesticated())}]} {#NonDomesticated: [{$0.Where(!type.#IsDomesticated())}]} {#IsDomesticated:[{$0.Matches('dog','cat')}]} {#Prepend:[{$0->[{$1}{$0}]}]} {#Surround:[{$0->[{$1}{$0}{$1}]}]} {#Quoted:[{$0->[{$0.#Surround('""')}]}]} {#data:[/data/people]}"; input = @"Shows use of bullet styles as well as modular subtemplates, automatic bulleting,` and indenting only for multiple values. You can see different bullet styles ` by changing the parameter to #showStyles from 1 through 5 {''.#showStyles(1)} Subtemplates: {#styleNumber:[1]} {#showStyles:[People:{#data:[ {.}{^.^.$1 = 2->[.0]} {[{ lastName}{ firstName.#Prepend(', ')}{ middleName.#Prepend(' ') }].ToUpper().#Quoted()} {.} Lastname: {lastName.IfMissing('No Last Name')} {.} FirstName: {firstName} {.} Pets {pets=>[({pets.Count()}): {.} Domesticated{#dpetcnt > 1->[ ({#dpetcnt})]}: {pets.#Domesticated():[{#formatPet}]} {.} Non-domesticated{#ndpetcnt > 1->[({#ndpetcnt})]}: {pets.#NonDomesticated():[{#formatPet}]} ],[no pets] } // ].@MissingValue('No Information Provided')}].@Include([{'#style'}{$1}])} {#formatPet:[ a {type.Case('zebra',[{[{name}y].ToLower()}],'dog','friskie','cat','fishy','nice')} ` {type} named {name} ]} {#Domesticated: [{$0.Where(type.#IsDomesticated())}]} {#NonDomesticated: [{$0.Where(!type.#IsDomesticated())}]} {#IsDomesticated:[{$0.Matches('dog','cat')}]} {#Prepend:[{$0->[{$1}{$0}]}]} {#Surround:[{$0->[{$1}{$0}{$1}]}]} {#Quoted:[{$0->[{$0.#Surround('""')}]}]} {#dpetcnt:[{pets.#Domesticated().Count()}]} {#ndpetcnt:[{pets.#NonDomesticated().Count()}]} {#style1:[].@BulletStyle('I.','(a)','•','i.')} {#style2:[].@BulletStyle('1','1.1','1.1.1','1(a)')} {#style3:[].@BulletStyle('-')} {#style4:[].@BulletStyle('')} {#style5:[].@BulletStyle(' I', '•', 'A.', '(1)')} {#data:[/data/people]}"; input = @"{'/data/events'.GroupBy(start.ToDate('YYYY-MM-DDT00:00:00'), 'group', 'start'):[ ` {start.ToUpper()} {group.OrderBy(start.ToDate('HHmm')):[{start.#formatTimes(end)}: {summary} {.} Notes: {description} {.} Location {location}]} ].@DateTest(/(star|end)/i).@BulletStyle('•').@DateFormat('dddd MMM D')} Subtemplates: {#SameDay:[{$0.ToDate('YYYYMMDD') = $1.ToDate('YYYYMMDD')}]} {#SameAMPM:[{$0.ToDate('a') = $1.ToDate('a') & $0.#SameDay($1)}]} {#onHour:[{$0.ToDate('mm') = '00'}]} {#formatTimes:[ { // Don't put am/pm for the start time if on the hour and same as end $0.ToDate([h{!$0.#onHour()->[:mm]}{!$0.#SameAMPM($1)->[a]}]) }-{ !$1.#SameDay($0)->[{$1.ToDate().ToUpper()} at ]}{$1.ToDate('h:mma') } ]}"; input = @"{#tests.Assert(#expected,'ALL TESTS PASSED')} Subtemplates: {#test:[{$0.Matches(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)-> [Test {$0} {$1.Assert($2,'passed')}]}]} {#test1:[ Explicit Single Indent{#data:[ {lastName}]}]} {#test1Result:[ Explicit Single Indent Johnson Smith]} {#test2:[ Implied Single Indent {#data:[{lastName}]}]} {#test2Result:[ Implied Single Indent Johnson Smith]} {#test3:[ Implied Double Indent{#data:[{lastName}{pets:[{name}]}]}]} {#test3Result:[ Implied Double Indent Johnson Buddy Ralph Stripes Smith Toto Dolly Stripes]} {#test4:[ Bulleted Implied Bulleted Indent{#data:[ // {.} {lastName}{pets:[{name}]}]}]} {#test4Result:[ Bulleted Implied Bulleted Indent (0.0) Johnson (1.0) Buddy (1.1) Ralph (1.2) Stripes (0.1) Smith (1.0) Toto (1.1) Dolly (1.2) Stripes].Compose()} {#test5:[ Bulleted Explicit Bulleted Indent{#data:[ // {.} {lastName}{pets:[ // {.} {name}]}]}].Compose()} {#test5Result:[ Bulleted Explicit Bulleted Indent (0.0) Johnson (1.0) Buddy (1.1) Ralph (1.2) Stripes (0.1) Smith (1.0) Toto (1.1) Dolly (1.2) Stripes]} {#test6:[ Hierarchy{#data:[ // {.} {lastName}{pets:[ // {.} {name} who is owned by {.} {^.^:[{firstName} who owns {.} {pets:[{type}]}]}]}]}].Compose()} {#test6Result:[ Hierarchy (0.0) Johnson (1.0) Buddy who is owned by (2.0) Doris who owns (3.0) dog (3.1) lion (3.2) tiger (1.1) Ralph who is owned by (2.0) Doris who owns (3.0) dog (3.1) lion (3.2) tiger (1.2) Stripes who is owned by (2.0) Doris who owns (3.0) dog (3.1) lion (3.2) tiger (0.1) Smith (1.0) Toto who is owned by (2.0) John who owns (3.0) dog (3.1) cat (3.2) zebra (1.1) Dolly who is owned by (2.0) John who owns (3.0) dog (3.1) cat (3.2) zebra (1.2) Stripes who is owned by (2.0) John who owns (3.0) dog (3.1) cat (3.2) zebra]} {#test7:[ Hierarchy that transitions from indent to bullet {#data:[ // {lastName}{pets:[ // {.} {name} who is owned by {.} {^.^:[{firstName} who owns {.} {pets:[{type}]}]}]}]}]} {#test7Result:[ Hierarchy that transitions from indent to bullet Johnson (0.0) Buddy who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger (0.1) Ralph who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger (0.2) Stripes who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger Smith (0.0) Toto who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra (0.1) Dolly who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra (0.2) Stripes who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra]} {#test8:[ Hierarchy that also transitions from indent to bullet {#data:[ // {firstName} {lastName} who owns {pets:[{name} who is owned by {.} {^.^:[{firstName} who owns {.} {pets:[{type}]}]}]}]}]} {#test8Result:[ Hierarchy that also transitions from indent to bullet Doris Johnson who owns Buddy who is owned by (0.0) Doris who owns (1.0) dog (1.1) lion (1.2) tiger Ralph who is owned by (0.0) Doris who owns (1.0) dog (1.1) lion (1.2) tiger Stripes who is owned by (0.0) Doris who owns (1.0) dog (1.1) lion (1.2) tiger John Smith who owns Toto who is owned by (0.0) John who owns (1.0) dog (1.1) cat (1.2) zebra Dolly who is owned by (0.0) John who owns (1.0) dog (1.1) cat (1.2) zebra Stripes who is owned by (0.0) John who owns (1.0) dog (1.1) cat (1.2) zebra]} {#test9:[ Continued list {#data:[{pets:[{name}]}]}]} {#test9Result:[ Continued list Buddy Ralph Stripes Toto Dolly Stripes]} {#test10:[ Bulleted Continued list ` {#data:[{pets:[ {.} {name}]}]}]} {#test10Result:[ Bulleted Continued list (0.0) Buddy (0.1) Ralph (0.2) Stripes (0.3) Toto (0.4) Dolly (0.5) Stripes]} {#test11:[ Hierarchy that also transitions from indent to bullet and back {#data:[ // {lastName} who owns {.} {pets:[{name} who is owned by {^.^:[{firstName} who owns {.} {pets:[{type} // ]}]}]}]}]} {#test11Result:[ Hierarchy that also transitions from indent to bullet and back Johnson who owns (0.0) Buddy who is owned by Doris who owns (1.0) dog (1.1) lion (1.2) tiger (0.1) Ralph who is owned by Doris who owns (1.0) dog (1.1) lion (1.2) tiger (0.2) Stripes who is owned by Doris who owns (1.0) dog (1.1) lion (1.2) tiger Smith who owns (0.0) Toto who is owned by John who owns (1.0) dog (1.1) cat (1.2) zebra (0.1) Dolly who is owned by John who owns (1.0) dog (1.1) cat (1.2) zebra (0.2) Stripes who is owned by John who owns (1.0) dog (1.1) cat (1.2) zebra]} {#test12:[ Additional variation of hierarchy that also transitions from indent to bullet ` and back {#data:[ // {lastName} who owns {.} {pets:[{name} who is owned by {.} {^.^:[{firstName} who owns {pets:[{type} // ]}]}]}]}]} {#test12Result:[ Additional variation of hierarchy that also transitions from indent to bullet and back Johnson who owns (0.0) Buddy who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger (0.1) Ralph who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger (0.2) Stripes who is owned by (1.0) Doris who owns (2.0) dog (2.1) lion (2.2) tiger Smith who owns (0.0) Toto who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra (0.1) Dolly who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra (0.2) Stripes who is owned by (1.0) John who owns (2.0) dog (2.1) cat (2.2) zebra]} {#test13:[ Yet another variation of hierarchy that also transitions from indent to bullet ` and back {#data:[ // {lastName} who owns {.} {pets:[{name} who is owned by {^.^:[{firstName} who owns {pets:[{type} // ]}]}]}]}]} {#test13Result:[ Yet another variation of hierarchy that also transitions from indent to bullet and back Johnson who owns (0.0) Buddy who is owned by Doris who owns dog lion tiger (0.1) Ralph who is owned by Doris who owns dog lion tiger (0.2) Stripes who is owned by Doris who owns dog lion tiger Smith who owns (0.0) Toto who is owned by John who owns dog cat zebra (0.1) Dolly who is owned by John who owns dog cat zebra (0.2) Stripes who is owned by John who owns dog cat zebra]} {#test14:[ Indent under indent under bullet {#data:[ // {lastName} who owns {.} {pets:[{name} who is owned by {^.^:[{firstName} who owns {pets:[{type} // ]}]}]}]}]} {#test14Result:[ Indent under indent under bullet Johnson who owns (0.0) Buddy who is owned by Doris who owns dog lion tiger (0.1) Ralph who is owned by Doris who owns dog lion tiger (0.2) Stripes who is owned by Doris who owns dog lion tiger Smith who owns (0.0) Toto who is owned by John who owns dog cat zebra (0.1) Dolly who is owned by John who owns dog cat zebra (0.2) Stripes who is owned by John who owns dog cat zebra]} {#test15:[ Automatic bulleting for multi-values{#data:[ // {lastName} who owns {.} {pets:[{name} who is owned by {^.^:[{firstName} who owns {pets:[{type} // ]}]}]}]}]} {#test15Result:[ Automatic bulleting for multi-values Johnson who owns (0.0) Buddy who is owned by Doris who owns dog lion tiger (0.1) Ralph who is owned by Doris who owns dog lion tiger (0.2) Stripes who is owned by Doris who owns dog lion tiger Smith who owns (0.0) Toto who is owned by John who owns dog cat zebra (0.1) Dolly who is owned by John who owns dog cat zebra (0.2) Stripes who is owned by John who owns dog cat zebra]} {#test16:[ {''.Compose() // reset numbering from previous tests }{[ A: People:{'/data/people':[ {.} Pets {[ {.} Domesticated{pets:[{type}]} ] } // ].Compose()} B: People:{'/data/people':[ {.} {lastName}{pets:[{type}]} ].@MissingValue('No Information Provided').Compose()} C: People:{'/data/people':[ {.} {lastName}{pets:[{type}]} ].Compose()} D: People:{'/data/people':[ {lastName}{pets:[{type}]} ].@MissingValue('No Information Provided').Compose()} E: People:{'/data/people':[ {.} {lastName}{pets:[ {.} {type}]} ].@MissingValue('No Information Provided').Compose()}]}]} {#test16Result:[ A: People: (0.0) Pets (1.0) Domesticated (2.0) dog (2.1) lion (2.2) tiger (0.1) Pets (1.0) Domesticated (2.0) dog (2.1) cat (2.2) zebra B: People: (0.0) Johnson (1.0) dog (1.1) lion (1.2) tiger (0.1) Smith (1.0) dog (1.1) cat (1.2) zebra C: People: (0.0) Johnson (1.0) dog (1.1) lion (1.2) tiger (0.1) Smith (1.0) dog (1.1) cat (1.2) zebra D: People:Johnson dog lion tiger Smith dog cat zebra E: People: (0.0) Johnson (1.0) dog (1.1) lion (1.2) tiger (0.1) Smith (1.0) dog (1.1) cat (1.2) zebra]} {#tests:[ // {'1'.#test(#test1,#test1Result)} {'2'.#test(#test2,#test2Result)} {'3'.#test(#test3,#test3Result)} {'4'.#test(#test4,#test4Result)} {'5'.#test(#test5,#test5Result)} {'6'.#test(#test6,#test6Result)} {'7'.#test(#test7,#test7Result)} {'8'.#test(#test8,#test8Result)} {'9'.#test(#test9,#test9Result)} {'10'.#test(#test10,#test10Result)} {'11'.#test(#test11,#test11Result)} {'12'.#test(#test12,#test12Result)} {'13'.#test(#test13,#test13Result)} {'14'.#test(#test14,#test14Result)} {'15'.#test(#test15,#test15Result)} {'16'.#test(#test16,#test16Result)} ]} {#expected:[ // Test 1 passed Test 2 passed Test 3 passed Test 4 passed Test 5 passed Test 6 passed Test 7 passed Test 8 passed Test 9 passed Test 10 passed Test 11 passed Test 12 passed Test 13 passed Test 14 passed Test 15 passed Test 16 passed ]} {#data:[/data/people]}"; input = input.Replace("\r", ""); AntlrInputStream inputStream = new AntlrInputStream(input); TextTemplateLexer textTemplateLexer = new TextTemplateLexer(inputStream); CommonTokenStream commonTokenStream = new CommonTokenStream(textTemplateLexer); TextTemplateParser textTemplateParser = new TextTemplateParser(commonTokenStream); TextTemplateParser.CompilationUnitContext compilationUnitContext = textTemplateParser.compilationUnit(); TextTemplateVisitor visitor = new TextTemplateVisitor(); Func <string, string> urlCallback = url => { string ret = "Bad Url"; switch (url) { case "/data/people": ret = @"[ { ""firstName"": ""Doris"" ,""lastName"": ""Johnson"" ,""pets"": [ { ""type"": ""dog"" ,""name"": ""Buddy"" },{ ""type"": ""lion"" ,""name"": ""Ralph"" },{ ""type"": ""tiger"" ,""name"": ""Stripes"" } ] }, { ""firstName"": ""John"" ,""lastName"": ""Smith"" ,""pets"": [ { ""type"": ""dog"" ,""name"": ""Toto"" },{ ""type"": ""cat"" ,""name"": ""Dolly"" },{ ""type"": ""zebra"" ,""name"": ""Stripes"" } ] } ]"; break; case "/data/events": ret = @"[ {""start"": ""2020-05-20T19:00:00"", ""end"": ""2020-05-20T22:30:00"",""summary"": ""Dinner with Mom"", ""description"":""Dresscode: Elegant and ironed!"", ""location"": ""800 Howard St., San Francisco, CA 94103""}, {""start"": ""2020-06-20T15:00:00"", ""end"": ""2020-06-22T15:30:00"",""summary"": ""Hotdog eating competition"", ""location"": ""43 Chapel Ave, Jersey City, NJ 07305""}, {""start"": ""2020-05-28T10:00:00"", ""end"": ""2020-05-28T12:15:00"",""summary"": ""Vet"", ""description"":""Brush the dog's teeth"", ""location"": ""3771 Van Dyke Ave San Diego, CA 92105""}, {""start"": ""2020-05-28T08:30:00"", ""end"": ""2020-05-28T10:00:00"",""summary"": ""Meet with Paul"", ""description"":""Discussion of future plans"", ""location"": ""1200 Railing St., Brunswick, Md.""}, {""start"": ""2020-06-30T10:00:00"", ""end"": ""2020-06-30T11:30:00"",""summary"": ""Jogging class"", ""description"":""Bring your inhaler"", ""location"": ""3014 Rosalinda San Clemente, CA 92673""} ]"; break; } return(ret); }; Dictionary <string, object> options = new Dictionary <string, object>(); options["urlCallback"] = urlCallback; string result = visitor.interpret(input, options); Debug.Write(result + "\n"); Console.Write(result + "\n"); }
public IEnumerable <EmailMessageEntity> CreateEmailMessageInternal() { ExecuteQuery(); foreach (EmailAddressEmbedded from in GetFrom()) { foreach (List <EmailOwnerRecipientData> recipients in GetRecipients()) { CultureInfo ci = recipients.Where(a => a.Kind == EmailRecipientKind.To).Select(a => a.OwnerData.CultureInfo).FirstOrDefault()?.ToCultureInfo() ?? EmailLogic.Configuration.DefaultCulture.ToCultureInfo(); EmailMessageEntity email = new EmailMessageEntity { Target = entity?.ToLite() ?? (this.model !.UntypedEntity as Entity)?.ToLite(), Recipients = recipients.Select(r => new EmailRecipientEmbedded(r.OwnerData) { Kind = r.Kind }).ToMList(), From = from, IsBodyHtml = template.IsBodyHtml, EditableMessage = template.EditableMessage, Template = template.ToLite(), Attachments = template.Attachments.SelectMany(g => EmailTemplateLogic.GenerateAttachment.Invoke(g, new EmailTemplateLogic.GenerateAttachmentContext(this.qd, template, dicTokenColumn, currentRows, ci) { ModelType = template.Model?.ToType(), Model = model, Entity = entity, })).ToMList() }; EmailTemplateMessageEmbedded message = template.GetCultureMessage(ci) ?? template.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo()); if (message == null) { throw new InvalidOperationException("Message {0} does not have a message for CultureInfo {1} (or Default)".FormatWith(template, ci)); } using (CultureInfoUtils.ChangeBothCultures(ci)) { email.Subject = SubjectNode(message).Print( new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows) { IsHtml = false, Model = model }); email.Body = TextNode(message).Print( new TextTemplateParameters(entity, ci, dicTokenColumn, currentRows) { IsHtml = template.IsBodyHtml, Model = model, }); } yield return(email); } } } TextTemplateParser.BlockNode TextNode(EmailTemplateMessageEmbedded message) { if (message.TextParsedNode == null) { string body = message.Text; if (template.MasterTemplate != null) { var emt = template.MasterTemplate.RetrieveAndRemember(); var emtm = emt.GetCultureMessage(message.CultureInfo.ToCultureInfo()) ?? emt.GetCultureMessage(EmailLogic.Configuration.DefaultCulture.ToCultureInfo()); if (emtm != null) { body = EmailMasterTemplateEntity.MasterTemplateContentRegex.Replace(emtm.Text, m => body); } } message.TextParsedNode = TextTemplateParser.Parse(body, qd, template.Model?.ToType()); } return((TextTemplateParser.BlockNode)message.TextParsedNode); } TextTemplateParser.BlockNode SubjectNode(EmailTemplateMessageEmbedded message) { if (message.SubjectParsedNode == null) { message.SubjectParsedNode = TextTemplateParser.Parse(message.Subject, qd, template.Model?.ToType()); } return((TextTemplateParser.BlockNode)message.SubjectParsedNode); } IEnumerable <EmailAddressEmbedded> GetFrom() { if (template.From != null) { if (template.From.Token != null) { ResultColumn owner = dicTokenColumn.GetOrThrow(template.From.Token.Token); if (!template.SendDifferentMessages) { yield return(new EmailAddressEmbedded(currentRows.Select(r => (EmailOwnerData)r[owner] !).Distinct().SingleEx())); } else { var groups = currentRows.GroupBy(r => (EmailOwnerData)r[owner] !); if (groups.Count() == 1 && groups.Single().Key?.Owner == null) { yield break; } else { foreach (var gr in groups) { var old = currentRows; currentRows = gr; yield return(new EmailAddressEmbedded(gr.Key)); currentRows = old; } } } } else { yield return(new EmailAddressEmbedded(new EmailOwnerData { CultureInfo = null, Email = template.From.EmailAddress !, DisplayName = template.From.DisplayName, }));
public static SMSMessageEntity CreateSMSMessage(Lite <SMSTemplateEntity> template, Entity entity, ISMSModel?model, CultureInfo?forceCulture) { var t = SMSLogic.SMSTemplatesLazy.Value.GetOrThrow(template); var defaultCulture = SMSLogic.Configuration.DefaultCulture.ToCultureInfo(); var qd = QueryLogic.Queries.QueryDescription(t.Query.ToQueryName()); List <QueryToken> tokens = new List <QueryToken>(); t.ParseData(qd); tokens.Add(t.To.Token); var parsedNodes = t.Messages.ToDictionary( tm => tm.CultureInfo.ToCultureInfo(), tm => TextTemplateParser.Parse(tm.Message, qd, t.Model?.ToType()) ); parsedNodes.Values.ToList().ForEach(n => n.FillQueryTokens(tokens)); var columns = tokens.Distinct().Select(qt => new Column(qt, null)).ToList(); var filters = model != null?model.GetFilters(qd) : new List <Filter> { new FilterCondition(QueryUtils.Parse("Entity", qd, 0), FilterOperation.EqualTo, entity.ToLite()) }; var table = QueryLogic.Queries.ExecuteQuery(new QueryRequest { QueryName = qd.QueryName, Columns = columns, Pagination = model?.GetPagination() ?? new Pagination.All(), Filters = filters, Orders = model?.GetOrders(qd) ?? new List <Order>(), }); var columnTokens = table.Columns.ToDictionary(a => a.Column.Token); var ownerData = (SMSOwnerData)table.Rows[0][columnTokens.GetOrThrow(t.To.Token)] !; var ci = forceCulture ?? ownerData.CultureInfo?.ToCultureInfo() ?? defaultCulture; var node = parsedNodes.TryGetC(ci) ?? parsedNodes.GetOrThrow(defaultCulture); return(new SMSMessageEntity { Template = t.ToLite(), Message = node.Print(new TextTemplateParameters(entity, ci, columnTokens, table.Rows) { Model = model }), From = t.From, EditableMessage = t.EditableMessage, State = SMSMessageState.Created, Referred = ownerData.Owner, DestinationNumber = ownerData.TelephoneNumber, Certified = t.Certified }); }