/// <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; }
/// <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; }
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); }