示例#1
0
        /// <summary>
        /// Register a Lava Block with the Fluid Parser.
        /// </summary>
        /// <param name="tagName"></param>
        public void RegisterLavaBlock(string tagName, LavaTagFormatSpecifier format = LavaTagFormatSpecifier.LiquidTag)
        {
            // Create a parser for the Lava block that does the following:
            // 1. Captures any optional attributes that are contained in the open tag.
            // 2. Creates a new Statement that will execute when the block is rendered. The Statement captures the block content
            //    as literal text, so that it can be scanned and tokenized by the Lava library before being passed back to Fluid
            //    for final rendering.
            // 3. Throw an exception if the Block is malformed.
            Parser <LavaTagResult> tokenEndParser;

            var    registerTagName = tagName;
            string errorMessage;

            if (format == LavaTagFormatSpecifier.LavaShortcode)
            {
                tokenEndParser = LavaTagParsers.LavaShortcodeEnd();
                tagName        = tagName.Substring(0, tagName.Length - "_".Length);
                errorMessage   = $"Invalid '{{[ {tagName} ]}}' shortcode block";
            }
            else
            {
                tokenEndParser = LavaTokenEnd;
                errorMessage   = $"Invalid '{{% {tagName} %}}' block";
            }

            var lavaBlock = AnyCharBefore(tokenEndParser, canBeEmpty: true)
                            .AndSkip(tokenEndParser)
                            .And(new LavaTagParsers.LavaBlockContentParser(tagName, format))
                            .Then <Statement>(x => new FluidLavaBlockStatement(this, tagName, format, x.Item1, x.Item2))
                            .ElseError(errorMessage);

            RegisteredTags[registerTagName] = lavaBlock;
        }
示例#2
0
        /// <summary>
        /// Register a Lava Tag with the Fluid Parser.
        /// </summary>
        /// <param name="tagName"></param>
        public void RegisterLavaTag(string tagName, LavaTagFormatSpecifier format = LavaTagFormatSpecifier.LiquidTag)
        {
            // Create a parser for the Lava tag that does the following:
            // 1. Processes all of the content from the end of the open tag until the end of the closing tag.
            // 2. Captures any optional attributes that are contained in the open tag.
            // 3. Create a new Statement that will execute when the tag is rendered.
            // 4. Throw an exception if the Tag is malformed.
            Parser <LavaTagResult> tokenEndParser;

            var    registerTagName = tagName;
            string errorMessage;

            if (format == LavaTagFormatSpecifier.LavaShortcode)
            {
                tokenEndParser = LavaTagParsers.LavaShortcodeEnd();
                tagName        = tagName.Substring(0, tagName.Length - "_".Length);
                errorMessage   = $"Invalid '{{[ {tagName} ]}}' shortcode tag";
            }
            else
            {
                tokenEndParser = LavaTokenEnd;
                errorMessage   = $"Invalid '{{% {tagName} %}}' tag";
            }

            var lavaTag = AnyCharBefore(tokenEndParser, canBeEmpty: true)
                          .AndSkip(tokenEndParser)
                          .Then <Statement>(x => new FluidLavaTagStatement(tagName, format, x))
                          .ElseError(errorMessage);

            this.RegisteredTags[registerTagName] = lavaTag;
        }
示例#3
0
            public override bool Parse(ParseContext context, ref ParseResult <LavaTagResult> result)
            {
                var start = context.Scanner.Cursor.Position;

                if (_skipWhiteSpace)
                {
                    context.SkipWhiteSpace();
                }

                Parser <(LavaTagResult, string, TextSpan, LavaTagResult)> tagParser;

                if (_tagFormat == LavaTagFormatSpecifier.LavaShortcode)
                {
                    tagParser = LavaTagParsers.LavaShortcodeStart()
                                .And(Terms.Text(_tagName))
                                .And(AnyCharBefore(LavaTagParsers.LavaShortcodeEnd(), canBeEmpty: true))
                                .And(LavaTagParsers.LavaShortcodeEnd());
                }
                else
                {
                    tagParser = LavaTagParsers.LavaTagStart()
                                .And(Terms.Text(_tagName)).
                                And(AnyCharBefore(LavaFluidParser.LavaTokenEnd, canBeEmpty: true))
                                .And(LavaFluidParser.LavaTokenEnd);
                }

                var tagResult = new ParseResult <(LavaTagResult, string, TextSpan, LavaTagResult)>();

                var parseSucceeded = tagParser.Parse(context, ref tagResult);

                if (!parseSucceeded)
                {
                    context.Scanner.Cursor.ResetPosition(start);
                    return(false);
                }

                var lavaResult = new LavaTagResult(tagResult.Value.Item1.TagResult,
                                                   new TextSpan(context.Scanner.Buffer, start.Offset, context.Scanner.Cursor.Position.Offset - start.Offset),
                                                   _tagFormat);

                result.Set(start.Offset, context.Scanner.Cursor.Offset, lavaResult);

                return(true);
            }