public override List <PageFragment> Parse(ScriptContext context, ReadOnlyMemory <char> body, ReadOnlyMemory <char> modifiers) { var pageFragments = context.ParseTemplate(body); return(pageFragments); }
// {{#if ...}} // ^ public static ReadOnlyMemory <char> ParseTemplateScriptBlock(this ReadOnlyMemory <char> literal, ScriptContext context, out PageBlockFragment blockFragment) { literal = literal.ParseVarName(out var blockNameSpan); PageBlockFragment statement; var blockName = blockNameSpan.ToString(); var endBlock = "{{/" + blockName + "}}"; var endExprPos = literal.IndexOf("}}"); if (endExprPos == -1) { throw new SyntaxErrorException($"Unterminated '{blockName}' block expression, near '{literal.DebugLiteral()}'"); } var blockExpr = literal.Slice(0, endExprPos).Trim(); literal = literal.Advance(endExprPos + 2); if (context.ParseAsVerbatimBlock.Contains(blockName)) { var endBlockPos = literal.IndexOf(endBlock); if (endBlockPos == -1) { throw new SyntaxErrorException($"Unterminated end block '{endBlock}'"); } var blockBody = literal.Slice(0, endBlockPos); literal = literal.Advance(endBlockPos + endBlock.Length).TrimFirstNewLine(); var body = new List <PageFragment> { new PageStringFragment(blockBody) }; blockFragment = new PageBlockFragment(blockName, blockExpr, body); return(literal); } else { var parseAsCode = context.ParseAsCodeBlock.Contains(blockName); literal = literal.ParseTemplateBody(blockNameSpan, out var bodyText); List <PageFragment> bodyFragments = null; JsBlockStatement bodyStatements = null; if (!parseAsCode) { bodyFragments = context.ParseTemplate(bodyText); } else { bodyStatements = context.ParseCode(bodyText); } var elseBlocks = new List <PageElseBlock>(); while (literal.StartsWith("{{else")) { literal = literal.ParseTemplateElseBlock(blockName, out var elseArgument, out var elseBody); var elseBlock = !parseAsCode ? new PageElseBlock(elseArgument, context.ParseTemplate(elseBody)) : new PageElseBlock(elseArgument, context.ParseCode(elseBody)); elseBlocks.Add(elseBlock); } literal = literal.Advance(2 + 1 + blockName.Length + 2); //remove new line after partial block end tag literal = literal.TrimFirstNewLine(); blockFragment = !parseAsCode ? new PageBlockFragment(blockName, blockExpr, bodyFragments, elseBlocks) : new PageBlockFragment(blockName, blockExpr, bodyStatements, elseBlocks); return(literal); } }