コード例 #1
0
        /// <inheritdoc/>
        protected override void Write(StringRender renderer, SectionToken obj, Context context)
        {
            var value = context.Lookup(obj.SectionName);

            if (!context.IsTruthyValue(value))
            {
                return;
            }

            if (value is IEnumerable && !context.RendererSettings.SectionBlacklistTypes.Any(x => x.IsInstanceOfType(value)))
            {
                var arrayValue = value as IEnumerable;

                foreach (var v in arrayValue)
                {
                    renderer.Render(obj, context.Push(v));
                }
            }
            else if (value is IEnumerator)
            {
                var enumeratorValue = value as IEnumerator;
                while (enumeratorValue.MoveNext())
                {
                    renderer.Render(obj, context.Push(enumeratorValue.Current));
                }

                enumeratorValue.Reset();
            }
            else if (LambdaTypes.Contains(value.GetType()))
            {
                var sectionContent = obj.SectionContent.ToString();

                switch (value)
                {
                case Func <dynamic, string, object> func:
                    value = func(context.View, sectionContent);
                    break;

                case Func <string, object> func:
                    value = func(sectionContent);
                    break;

                case Func <dynamic, string, Func <string, string>, object> func:
                    value = func(context.View, sectionContent, RenderInContext(context, obj.Tags));
                    break;

                case Func <string, Func <string, string>, object> func:
                    value = func(sectionContent, RenderInContext(context, obj.Tags));
                    break;
                }

                var valueString = value?.ToString() ?? string.Empty;
                renderer.Render(context.RendererSettings.Parser.Parse(valueString, obj.Tags), context);
            }
            else if (value is IDictionary || value != null)
            {
                renderer.Render(obj, context.Push(value));
            }
        }
コード例 #2
0
        /// <inheritdoc/>
        protected override void Write(StringRender renderer, InterpolationToken obj, Context context)
        {
            var value = context.Lookup(obj.Content.ToString());

            var functionValueDynamic = value as Func <dynamic, object>;
            var functionValue        = value as Func <object>;

            if (functionValueDynamic != null || functionValue != null)
            {
                object functionResult = functionValueDynamic != null?functionValueDynamic.Invoke(context.View) : functionValue.Invoke();

                var resultString = functionResult.ToString();
                if (resultString.Contains("{{"))
                {
                    renderer.Render(context.RendererSettings.Parser.Parse(resultString), context);
                    return;
                }

                value = resultString;
            }

            if (obj.EscapeResult && value != null)
            {
                value = WebUtility.HtmlEncode(value.ToString());
            }

            if (obj.Indent > 0)
            {
                renderer.Write(' ', obj.Indent);
            }

            renderer.Write(value?.ToString());
        }
コード例 #3
0
        /// <inheritdoc/>
        public string Render(string template, object view, IDictionary <string, string> partials, RenderSettings settings)
        {
            var loadedTemplate = RendererSettings.TemplateLoader.Load(template);

            if (loadedTemplate == null)
            {
                throw new UnknownTemplateException("No template was found with the name '" + template + "'");
            }

            var document = RendererSettings.Parser.Parse(loadedTemplate, RendererSettings.DefaultTags, pipeline: RendererSettings.ParserPipeline);

            var textwriter = new StringWriter();

            var renderer = new StringRender(textwriter, RendererSettings.RendererPipeline, RendererSettings.MaxRecursionDepth);

            var partialsLoader = RendererSettings.PartialTemplateLoader;

            if (partials != null && partials.Keys.Count > 0)
            {
                partialsLoader = new CompositeLoader(new DictionaryLoader(partials), RendererSettings.PartialTemplateLoader);
            }

            renderer.Render(document, new Context(view, RendererSettings, partialsLoader, settings ?? RendererSettings.RenderSettings));

            renderer.Writer.Flush();
            return(((StringWriter)renderer.Writer).ToString());
        }
コード例 #4
0
        /// <inheritdoc/>
        protected override void Write(StringRender renderer, SectionToken obj, Context context)
        {
            var value = context.Lookup(obj.SectionName);

            if (!context.IsTruthyValue(value))
            {
                return;
            }

            if (value is IEnumerable && !context.RendererSettings.SectionBlacklistTypes.Any(x => x.IsInstanceOfType(value)))
            {
                var arrayValue = value as IEnumerable;

                foreach (var v in arrayValue)
                {
                    renderer.Render(obj, context.Push(v));
                }
            }
            else if (value is IEnumerator)
            {
                var enumeratorValue = value as IEnumerator;
                while (enumeratorValue.MoveNext())
                {
                    renderer.Render(obj, context.Push(enumeratorValue.Current));
                }

                enumeratorValue.Reset();
            }
            else if (value is Func <dynamic, string, object> || value is Func <string, object> )
            {
                var functionDynamicValue = value as Func <dynamic, string, object>;
                var functionStringValue  = value as Func <string, object>;
                var sectionContent       = obj.SectionContent;

                value = functionDynamicValue != null
                    ? functionDynamicValue.Invoke(context.View, sectionContent.ToString())
                    : functionStringValue.Invoke(sectionContent.ToString());

                renderer.Render(context.RendererSettings.Parser.Parse(value.ToString(), obj.Tags), context);
            }
            else if (value is IDictionary || value != null)
            {
                renderer.Render(obj, context.Push(value));
            }
        }
コード例 #5
0
        /// <inheritdoc/>
        protected override void Write(StringRender renderer, InvertedSectionToken obj, Context context)
        {
            var value = context.Lookup(obj.SectionName);

            if (!context.IsTruthyValue(value))
            {
                renderer.Render(obj, context);
            }
        }
コード例 #6
0
        /// <inheritdoc/>
        protected override void Write(StringRender renderer, PartialToken obj, Context context)
        {
            var    partialName = obj.Content;
            string template    = null;

            if (context.PartialLoader != null)
            {
                template = context.PartialLoader.Load(partialName.ToString());
            }

            if (template != null)
            {
                renderer.Render(context.RendererSettings.Parser.Parse(template, lineIndent: obj.LineIndent), context);
            }
        }
        /// <inheritdoc />
        protected override void Write(StringRender renderer, InterpolationToken obj, Context context)
        {
            var    content = obj.Content.ToString();
            string format  = null;

            var pos = content.IndexOf(':');

            if (pos > 0)
            {
                format  = content.Substring(pos + 1);
                content = content.Substring(0, pos);
            }

            var value = context.Lookup(content);

            var functionValueDynamic = value as Func <dynamic, object>;
            var functionValue        = value as Func <object>;

            if (functionValueDynamic != null || functionValue != null)
            {
                object functionResult = functionValueDynamic != null?functionValueDynamic.Invoke(context.View) : functionValue.Invoke();

                var resultString = functionResult.ToString();
                if (resultString.Contains("{{"))
                {
                    renderer.Render(context.RendererSettings.Parser.Parse(resultString), context);
                    return;
                }

                value = resultString;
            }

            var formattedValue = ApplyFormat(value, format);

            if (!context.RenderSettings.SkipHtmlEncoding && obj.EscapeResult && value != null)
            {
                formattedValue = WebUtility.HtmlEncode(formattedValue);
            }

            if (obj.Indent > 0)
            {
                renderer.Write(' ', obj.Indent);
            }

            renderer.Write(formattedValue);
        }
コード例 #8
0
        private Func <string, string> RenderInContext(Context context, Classes.Tags tags)
        {
            return((str) =>
            {
                if (!str.Contains(tags.StartTag))
                {
                    return str;
                }

                using var writer = new StringWriter();
                var blockRenderer = new StringRender(writer, context.RendererSettings.RendererPipeline);
                var parsed = context.RendererSettings.Parser.Parse(str, tags);

                blockRenderer.Render(parsed, context);

                return writer.ToString();
            });
        }