Example #1
0
            public override void MutateState(EmailRenderer renderer)
            {
                var iteratorParamGroups = renderer._emailParams.Where(x => IsIteratorParam(x.Key))
                                          .Select(x => new { param = x.Key.Prefix("::"), group = x.Key.Suffix("::"), value = x.Value })
                                          .GroupBy(x => x.group);

                //this gives us groups of parameters by iteration..
                //param = e.g. URL or Person.Name

                renderer._outputSb = renderer._finalSb;

                foreach (var iteratorParamGroup in iteratorParamGroups)
                {
                    var iteratorRenderer = new EmailRenderer(renderer._config);

                    var emailParamsForIterator = renderer._emailParams.Concat(iteratorParamGroup
                                                                              .Select(iteratorParam => new KeyValuePair <string, string>("{0}:Item{1}".FormatWith(_blockName, GetPropertyForIterator(iteratorParam.param)), iteratorParam.value)))
                                                 .ToDictionary(x => x.Key, x => x.Value);

                    var renderedIteration = iteratorRenderer.RenderFromTemplate(_blockTemplate, emailParamsForIterator);

                    renderer._outputSb.Append(renderedIteration);
                }

                renderer._iteratorBlock = null;
            }
Example #2
0
        public string RenderFromTemplate(string template, IDictionary <string, string> emailParams)
        {
            _state       = EmailRendererState.Normal;
            _emailParams = emailParams;
            _outputSb    = _finalSb;

            foreach (var c in template)
            {
                switch (_state)
                {
                case EmailRendererState.Normal:
                    if (c == '$')
                    {
                        _outputSb.Append(_bufferSb.ToString());
                        _bufferSb.Clear();
                        _bufferSb.Append(c);
                        _state = EmailRendererState.BeginParam;
                    }
                    else
                    {
                        _bufferSb.Append(c);
                    }
                    break;

                case EmailRendererState.BeginParam:
                    if (c == '(')
                    {
                        _bufferSb.Clear();
                        _state = EmailRendererState.InParam;
                    }
                    else
                    {
                        _state = EmailRendererState.Normal;
                    }
                    break;

                case EmailRendererState.InParam:
                    if (c == ')')
                    {
                        var directive = GetDirective();
                        directive.MutateState(this);
                        _bufferSb.Clear();
                        _state = EmailRendererState.Normal;
                    }
                    else
                    {
                        _bufferSb.Append(c);
                    }
                    break;
                }
            }

            _outputSb.Append(_bufferSb.ToString());

            if (_masterTemplateName != null)
            {
                var masterRenderer  = new EmailRenderer(_config, _templateLocator);
                var emailParamsCopy = emailParams.ToDictionary(x => x.Key, x => x.Value);

                foreach (var placeholder in _placeholderSbs)
                {
                    emailParamsCopy[placeholder.Key] = placeholder.Value.ToString();
                }

                if (!_placeholderSbs.Any())
                {
                    emailParamsCopy["Placeholder"] = _finalSb.ToString();
                }

                var masterTemplate = _templateLocator.GetTemplate(_masterTemplateName);
                return(masterRenderer.RenderFromTemplate(masterTemplate, emailParamsCopy));
            }

            return(_outputSb.ToString());
        }