Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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();
Exemplo n.º 4
0
        TextTemplateParser.BlockNode SubjectNode(EmailTemplateMessageEmbedded message)
        {
            if (message.SubjectParsedNode == null)
            {
                message.SubjectParsedNode = TextTemplateParser.Parse(message.Subject, qd, template.Model?.ToType());
            }

            return((TextTemplateParser.BlockNode)message.SubjectParsedNode);
        }
Exemplo n.º 5
0
        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
            }));
        }
Exemplo n.º 6
0
        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));
            }
        }
Exemplo n.º 7
0
        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,
                            }
                        });
                    }
            });
        }
Exemplo n.º 8
0
        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,
                        }
                    });
                }
            });
        }
Exemplo n.º 9
0
        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();
                }
            }
        }
Exemplo n.º 10
0
        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);
            }
        }
Exemplo n.º 11
0
        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)] !;
Exemplo n.º 12
0
    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,
                    }
                });
            }
        });
    }
Exemplo n.º 13
0
        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, '-'))));
            }
        }
Exemplo n.º 14
0
        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");
        }
Exemplo n.º 15
0
        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,
                    }));
Exemplo n.º 16
0
        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
            });
        }