Exemple #1
0
 private string Serialize(ViewBufferTextWriterContent buffer)
 {
     using (var sw = new StringWriter())
     {
         buffer.WriteTo(sw, HtmlEncoder.Default);
         return(sw.ToString());
     }
 }
Exemple #2
0
        public void ShouldWriteObject()
        {
            var buffer = new ViewBufferTextWriterContent();

            buffer.Write((object)"abcd");

            var result = Serialize(buffer);

            Assert.Equal("abcd", result);
        }
Exemple #3
0
        public void ShouldWriteBuffer()
        {
            var buffer = new ViewBufferTextWriterContent();

            buffer.Write("abcd".ToCharArray());

            var result = Serialize(buffer);

            Assert.Equal("abcd", result);
        }
Exemple #4
0
        public void ShouldWriteChar()
        {
            var buffer = new ViewBufferTextWriterContent();

            buffer.Write('a');

            var result = Serialize(buffer);

            Assert.Equal("a", result);
        }
Exemple #5
0
        public void ShouldWriteString()
        {
            var buffer = new ViewBufferTextWriterContent();

            buffer.Write("<div>");

            var result = Serialize(buffer);

            Assert.Equal("<div>", result);
        }
Exemple #6
0
        public static async ValueTask <Completion> WriteToAsync(List <FilterArgument> argumentsList, IReadOnlyList <Statement> statements, TextWriter writer, TextEncoder encoder, TemplateContext context)
        {
            var services       = ((LiquidTemplateContext)context).Services;
            var layoutAccessor = services.GetRequiredService <ILayoutAccessor>();

            string position = null;
            string name     = null;

            for (var i = 0; i < argumentsList.Count; i++)
            {
                var argument = argumentsList[i];
                // check common case
                if (String.IsNullOrEmpty(argument.Name) && argument.Expression is LiteralExpression literalExpression)
                {
                    name = literalExpression.Value.ToStringValue();
                    continue;
                }

                switch (argument.Name)
                {
                case "position":
                    position = (await argument.Expression.EvaluateAsync(context)).ToStringValue();
                    break;

                case null:
                case "name":
                case "":
                    name ??= (await argument.Expression.EvaluateAsync(context)).ToStringValue();
                    break;
                }
            }

            if (statements != null && statements.Count > 0)
            {
                var content = new ViewBufferTextWriterContent();

                var completion = await statements.RenderStatementsAsync(content, encoder, context);

                if (completion != Completion.Normal)
                {
                    return(completion);
                }

                var layout = await layoutAccessor.GetLayoutAsync();

                var zone = layout.Zones[name];

                if (zone is Shape shape)
                {
                    await shape.AddAsync(content, position);
                }
            }

            return(Completion.Normal);
        }
Exemple #7
0
        public void ShouldWriteMultipleFragments()
        {
            var buffer = new ViewBufferTextWriterContent();

            buffer.Write("ab");
            buffer.Write("cd");

            var result = Serialize(buffer);

            Assert.Equal("abcd", result);
        }
Exemple #8
0
        public void ShouldWriteMultipleBufferFragmentPages()
        {
            var buffer = new ViewBufferTextWriterContent();

            var capacity = StringBuilderPool.GetInstance().Builder.Capacity;

            buffer.Write(new String('x', capacity - 1).ToCharArray());
            buffer.Write(new String('x', 11).ToCharArray(), 1, 3);
            var result = Serialize(buffer);

            Assert.Equal(capacity + 2, result.Length);
        }
Exemple #9
0
        public void ShouldWriteMultipleStringPages()
        {
            var buffer = new ViewBufferTextWriterContent();

            var capacity = StringBuilderPool.GetInstance().Builder.Capacity;
            var page     = new String('x', capacity);

            buffer.Write(page);
            buffer.Write(page);
            var result = Serialize(buffer);

            Assert.Equal(page + page, result);
        }
Exemple #10
0
        private ShapeBinding BuildShapeBinding(string shapeType, Template template)
        {
            return(new ShapeBinding()
            {
                BindingName = shapeType,
                BindingSource = shapeType,
                BindingAsync = async displayContext =>
                {
                    var content = new ViewBufferTextWriterContent();
                    await _liquidTemplateManager.RenderAsync(template.Content, content, _htmlEncoder, displayContext.Value);

                    return content;
                }
            });
        }
Exemple #11
0
        public async Task <IHtmlContent> RenderHtmlContentAsync(string source, TextEncoder encoder, object model = null, IEnumerable <KeyValuePair <string, FluidValue> > properties = null)
        {
            if (String.IsNullOrWhiteSpace(source))
            {
                return(HtmlString.Empty);
            }

            var result  = GetCachedTemplate(source);
            var context = new LiquidTemplateContext(_serviceProvider, _templateOptions);

            if (properties != null)
            {
                foreach (var property in properties)
                {
                    context.SetValue(property.Key, property.Value);
                }
            }

            var htmlContentWriter = new ViewBufferTextWriterContent();

            await result.RenderAsync(htmlContentWriter, encoder, context, model);

            return(htmlContentWriter);
        }
Exemple #12
0
        public static async ValueTask <Completion> WriteToAsync(string identifier, List <FilterArgument> arguments, IReadOnlyList <Statement> statements, TextWriter writer, TextEncoder encoder, TemplateContext context)
        {
            var services = ((LiquidTemplateContext)context).Services;

            var viewContextAccessor = services.GetRequiredService <ViewContextAccessor>();
            var viewContext         = viewContextAccessor.ViewContext;

            // If no identifier is set, use the first argument as the name of the tag helper
            // e.g., {% helper "input", for: "Text", class: "form-control" %}

            identifier ??= (await arguments[0].Expression.EvaluateAsync(context)).ToStringValue();

            // These mapping will assign an argument name to the first element in the filter arguments,
            // such that the tag helper can be matched based on the expected attribute names.
            if (DefaultArgumentsMapping.TryGetValue(identifier, out var mapping))
            {
                arguments    = new List <FilterArgument>(arguments);
                arguments[0] = new FilterArgument(mapping, arguments[0].Expression);
            }

            var filterArguments = new FilterArguments();

            foreach (var argument in arguments)
            {
                filterArguments.Add(argument.Name, await argument.Expression.EvaluateAsync(context));
            }

            var factory   = services.GetRequiredService <LiquidTagHelperFactory>();
            var activator = factory.GetActivator(identifier, filterArguments.Names);

            if (activator == LiquidTagHelperActivator.None)
            {
                return(Completion.Normal);
            }

            var tagHelper = factory.CreateTagHelper(activator, viewContext,
                                                    filterArguments, out var contextAttributes, out var outputAttributes);

            ViewBufferTextWriterContent content = null;

            if (statements != null && statements.Count > 0)
            {
                content = new ViewBufferTextWriterContent();

                var completion = await statements.RenderStatementsAsync(content, encoder, context);

                if (completion != Completion.Normal)
                {
                    return(completion);
                }
            }

            Interlocked.CompareExchange(ref _uniqueId, long.MaxValue, 0);
            var id = Interlocked.Increment(ref _uniqueId);

            var tagHelperContext = new TagHelperContext(contextAttributes, new Dictionary <object, object>(), id.ToString());

            TagHelperOutput tagHelperOutput = null;

            if (content != null)
            {
                tagHelperOutput = new TagHelperOutput(
                    identifier,
                    outputAttributes, (_, e) => Task.FromResult(new DefaultTagHelperContent().AppendHtml(content))
                    );
            }
            else
            {
                tagHelperOutput = new TagHelperOutput(
                    identifier,
                    outputAttributes, (_, e) => Task.FromResult <TagHelperContent>(new DefaultTagHelperContent())
                    );
            }

            await tagHelper.ProcessAsync(tagHelperContext, tagHelperOutput);

            return(Completion.Normal);
        }
Exemple #13
0
        public override async ValueTask <Completion> WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
        {
            if (!context.AmbientValues.TryGetValue("Services", out var servicesValue))
            {
                throw new ArgumentException("Services missing while invoking 'helper'");
            }

            var services = servicesValue as IServiceProvider;

            var viewContextAccessor = services.GetRequiredService <ViewContextAccessor>();
            var viewContext         = viewContextAccessor.ViewContext;

            var arguments = (FilterArguments)(await _arguments.EvaluateAsync(context)).ToObjectValue();
            var helper    = _helper ?? arguments["helper_name"].Or(arguments.At(0)).ToStringValue();

            var factory = services.GetRequiredService <LiquidTagHelperFactory>();

            // Each tag is a singleton, as views are
            if (_activator == null)
            {
                lock (this)
                {
                    if (_activator == null)
                    {
                        _activator = factory.GetActivator(helper, arguments.Names);
                    }
                }
            }

            if (_activator == LiquidTagHelperActivator.None)
            {
                return(Completion.Normal);
            }

            var tagHelper = factory.CreateTagHelper(_activator, viewContext,
                                                    arguments, out var contextAttributes, out var outputAttributes);

            ViewBufferTextWriterContent content = null;

            if (Statements != null && Statements.Count > 0)
            {
                content = new ViewBufferTextWriterContent();

                var completion = Completion.Break;

                for (var index = 0; index < Statements.Count; index++)
                {
                    completion = await Statements[index].WriteToAsync(content, encoder, context);

                    if (completion != Completion.Normal)
                    {
                        return(completion);
                    }
                }
            }

            var tagHelperContext = new TagHelperContext(contextAttributes, new Dictionary <object, object>(), Guid.NewGuid().ToString("N"));

            TagHelperOutput tagHelperOutput = null;

            if (content != null)
            {
                tagHelperOutput = new TagHelperOutput(
                    helper,
                    outputAttributes, (_, e) => Task.FromResult(new DefaultTagHelperContent().AppendHtml(content))
                    );

                tagHelperOutput.Content.AppendHtml(content);
            }
            else
            {
                tagHelperOutput = new TagHelperOutput(
                    helper,
                    outputAttributes, (_, e) => Task.FromResult <TagHelperContent>(new DefaultTagHelperContent())
                    );
            }

            await tagHelper.ProcessAsync(tagHelperContext, tagHelperOutput);

            tagHelperOutput.WriteTo(writer, (HtmlEncoder)encoder);

            return(Completion.Normal);
        }
Exemple #14
0
        public static async ValueTask <Completion> WriteToAsync(
            List <FilterArgument> argumentsList,
            IReadOnlyList <Statement> statements,
            TextWriter writer,
            TextEncoder encoder,
            TemplateContext context)
        {
            var services       = ((LiquidTemplateContext)context).Services;
            var layoutAccessor = services.GetRequiredService <ILayoutAccessor>();
            var logger         = services.GetRequiredService <ILogger <ZoneTag> >();

            string position = null;
            string name     = null;

            for (var i = 0; i < argumentsList.Count; i++)
            {
                var argument = argumentsList[i];
                // check common case
                if (String.IsNullOrEmpty(argument.Name) && argument.Expression is LiteralExpression literalExpression)
                {
                    name = literalExpression.Value.ToStringValue();
                    continue;
                }

                switch (argument.Name)
                {
                case "position":
                    position = (await argument.Expression.EvaluateAsync(context)).ToStringValue();
                    break;

                case null:
                case "name":
                case "":
                    name ??= (await argument.Expression.EvaluateAsync(context)).ToStringValue();
                    break;
                }
            }

            if (statements != null && statements.Count > 0)
            {
                var content = new ViewBufferTextWriterContent();

                var completion = await statements.RenderStatementsAsync(content, encoder, context);

                if (completion != Completion.Normal)
                {
                    return(completion);
                }

                var layout = await layoutAccessor.GetLayoutAsync();

                var zone = layout.Zones[name];

                if (zone is Shape shape)
                {
                    await shape.AddAsync(content, position);
                }
                else
                {
                    logger.LogWarning(
                        "Unable to add shape to the zone using the {{% zone %}} Liquid tag because the zone's type " +
                        "is \"{ActualType}\" instead of the expected {ExpectedType}",
                        zone.GetType().FullName,
                        nameof(Shape));
                }
            }

            return(Completion.Normal);
        }