Exemple #1
0
 private CompiledTemplate(JinjaEnvironment environment, ExpressionData templateNode, string?templateName, string?templatePath)
 {
     TemplateNode = templateNode;
     Environment  = environment;
     TemplateName = templateName;
     TemplatePath = templatePath;
 }
Exemple #2
0
        internal static bool TryParseRaw(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;


            if (RawParser.StartBlock.TryParse(enumerator.Current) == false)
            {
                return(false);
            }
            var startParsingNode = enumerator.Current;
            var children         = new List <ParsingNode>();

            while (true)
            {
                if (enumerator.MoveNext() == false)
                {
                    throw new NotImplementedException();
                }
                if (RawParser.EndBlock.TryParse(enumerator.Current))
                {
                    break;
                }
                children.Add(enumerator.Current);
            }
            var endParsingNode = enumerator.Current;

            parsedNode = new RawNode(startParsingNode, children, endParsingNode);
            return(true);
        }
 private ExpressionNode(JinjaEnvironment environment, string expression) : base(new ParsingNode(ParsingNodeType.Expression, new[] { new Token(TokenType.Unknown, expression) }))
 {
     Expression           = expression;
     Output               = false;
     ExpressionParserNode = environment.Evaluation.Parse(expression);
     WhiteSpaceControl    = new WhiteSpaceControlSet();
 }
Exemple #4
0
        internal static bool TryParseMacro(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;


            if (MacroParser.StartBlock.TryParse(enumerator.Current, out var outsideStart, out var insideStart) == false)
            {
                return(false);
            }
            if (MacroParser.StartBlock.TryGetAccumulation(MacroParser.MacroState.MacroDefinition, 0, out var macroText) == false)
            {
                throw new NotImplementedException();
            }
            var startParsingNode = enumerator.Current;

            enumerator.MoveNext();
            var contents = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();

            if (MacroParser.EndBlock.TryParse(enumerator.Current, out var insideEnd, out var outsideEnd) == false)
            {
                throw new NotImplementedException();
            }
            var endParsingNode = enumerator.Current;
            var contentsNode   = new ContainerNode(null, contents, null,
                                                   new WhiteSpaceControlSet(insideStart, insideEnd)
                                                   );

            parsedNode = new MacroNode(environment, startParsingNode, macroText, contentsNode, endParsingNode,
                                       new WhiteSpaceControlSet(outsideStart, outsideEnd)
                                       );
            return(true);
        }
        internal static bool TryParse(JinjaEnvironment environment, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;
            string?ifClause   = null;
            string?elseClause = null;

            if (ExpressionNodeParser.Parser.TryParse(enumerator.Current, out var startWhiteSpace, out var endWhiteSpace) == false)
            {
                return(false);
            }
            if (ExpressionNodeParser.Parser.TryGetAccumulation(ExpressionNodeParser.ExpressionState.Expression, 0, out var expression) == false)
            {
                throw new NotImplementedException();
            }
            if (ExpressionNodeParser.Parser.TryGetAccumulation(ExpressionNodeParser.ExpressionState.IfClause, 0, out var ifClauseString))
            {
                ifClause = ifClauseString;
            }
            if (ExpressionNodeParser.Parser.TryGetAccumulation(ExpressionNodeParser.ExpressionState.ElseClause, 0, out var elseClauseString))
            {
                elseClause = elseClauseString;
            }
            if (string.IsNullOrEmpty(expression))
            {
                throw new NotImplementedException();
            }

            parsedNode = new ExpressionNode(environment, enumerator.Current, startWhiteSpace, endWhiteSpace, expression, ifClause, elseClause);
            return(true);
        }
Exemple #6
0
 internal Lexer(JinjaEnvironment environment)
 {
     Environment = environment;
     _Delegates  = new TryDelegate[]
     {
         TryNewLine,
         TryWhiteSpace,
         TryKeyword,
         TrySingleChar,
     };
     _KeywordLookups.Add(environment.Settings.BlockStartString.ToCharArray(), TokenType.StatementStart);
     _KeywordLookups.Add(environment.Settings.BlockEndString.ToCharArray(), TokenType.StatementEnd);
     _KeywordLookups.Add(environment.Settings.VariableStartString.ToCharArray(), TokenType.ExpressionStart);
     _KeywordLookups.Add(environment.Settings.VariableEndString.ToCharArray(), TokenType.ExpressionEnd);
     _KeywordLookups.Add(environment.Settings.CommentStartString.ToCharArray(), TokenType.CommentStart);
     _KeywordLookups.Add(environment.Settings.CommentEndString.ToCharArray(), TokenType.CommentEnd);
     if (environment.Settings.LineCommentPrefix != null)
     {
         _KeywordLookups.Add(environment.Settings.LineCommentPrefix.ToCharArray(), TokenType.LineComment);
     }
     if (environment.Settings.LineStatementPrefix != null)
     {
         _KeywordLookups.Add(environment.Settings.LineStatementPrefix.ToCharArray(), TokenType.LineStatement);
     }
 }
 private DynamicTemplate(JinjaEnvironment environment, TemplateNode templateNode, string?templateName, string?templatePath)
 {
     TemplateNode = templateNode;
     Environment  = environment;
     TemplateName = templateName;
     TemplatePath = templatePath;
 }
Exemple #8
0
 public void CreateEnvironment()
 {
     _Environment = new JinjaEnvironment(settings: new EnvironmentSettings
     {
         TrimBlocks = true
     });
 }
Exemple #9
0
        public void ValidateValidTemplate()
        {
            var environment = new JinjaEnvironment();
            var result      = environment.ValidateTemplateFromString("{% if a is divisibleby 3 %}{% endif %}");

            Assert.AreEqual(true, result);
        }
Exemple #10
0
        public void ValidateInvalidTemplate()
        {
            var environment = new JinjaEnvironment();
            var result      = environment.ValidateTemplateFromString("{% if a is asdf %}{% endif %}");

            Assert.AreEqual(false, result);
        }
Exemple #11
0
        internal static bool TryParseFilter(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;
            if (FilterParser.StartBlock.TryParse(enumerator.Current) == false)
            {
                return(false);
            }
            var startParsingNode = enumerator.Current;

            if (FilterParser.StartBlock.TryGetAccumulation(FilterParser.FilterState.FilterName, 0, out var filterName) == false)
            {
                throw new NotImplementedException();
            }
            if (string.IsNullOrEmpty(filterName))
            {
                throw new NotImplementedException();
            }
            enumerator.MoveNext();

            var contents = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();


            if (FilterParser.EndBlock.TryParse(enumerator.Current) == false)
            {
                throw new NotImplementedException();
            }

            var contentsNode = new ContainerNode(null, contents, null);

            parsedNode = new FilterNode(startParsingNode, filterName, contentsNode, enumerator.Current);
            return(true);
        }
Exemple #12
0
        internal static CompiledTemplate LoadTemplate(JinjaEnvironment environment, string templateText, IDictionary <string, object?> variableTemplate, string templateName, string?templatePath)
        {
            var rootScope = CompiledScope.CreateRootScope("GLOBALS", variableTemplate);
            var expr      = ToExpression(templateName, environment, templateText, rootScope);

            return(new CompiledTemplate(environment, ExpressionData.CreateCompiled(expr, rootScope), templateName, templatePath));
        }
Exemple #13
0
 internal override bool TryGetSource(JinjaEnvironment environment, string templateName, [NotNullWhen(true)] out TemplateInfo?templateInfo)
 {
     templateInfo = default;
     if (_Templates.TryGetValue(templateName, out var templateText) == false)
     {
         return(false);
     }
     templateInfo = new TemplateInfo(templateText, templateName, true);
     return(true);
 }
Exemple #14
0
        internal static CompiledTemplate FromBlockNode(string templateName, JinjaEnvironment environment, BlockNode blockNode, IDictionary <string, object?> variableTemplate)
        {
            var rootScope = CompiledScope.CreateRootScope("GLOBALS", variableTemplate);

#if DEBUG
            var expr = NewASTCompiler.ToExpression(templateName, environment, blockNode, out var newcompiler, rootScope);
            return(new CompiledTemplate(environment, ExpressionData.CreateCompiled(expr, rootScope), blockNode.Name, null));
#else
            throw new NotImplementedException();
#endif
        }
Exemple #15
0
        //internal static Expression ToExpression(JinjaEnvironment environment, string templateText, IDictionary<string, object?> variableTemplate, out ASTCompiler compiler)
        //{
        //    var lexer = new Lexer(environment);
        //    var tokens = lexer.Tokenize(templateText).ToArray();
        //    var parsed = Parser.Parse(tokens).ToArray();
        //    var environmentTrimmed = EnvironmentTrimming.EnvironmentTrim(parsed, environment.Settings).ToArray();
        //    var templateNode = ASTGenerator.ParseTemplate(environmentTrimmed);
        //    var commentsRemoved = templateNode.Transform(CommentRemoverTransformer.Instance);
        //    var controlledWhiteSpace = WhiteSpaceController.ControlWhiteSpace(commentsRemoved);
        //    var containerAssembled = controlledWhiteSpace.Transform(TemplateContainerAssembler.Instance);

        //    var finished = NewASTCompiler.ToExpression(environment, containerAssembled, variableTemplate, out var newcompiler);
        //    throw new NotImplementedException();
        //}
        internal static Expression ToExpression(string templateName, JinjaEnvironment environment, string templateText, CompiledScope rootScope)
        {
            var containerAssembled = ASTNode.GetTemplateNode(environment, templateText);

#if DEBUG
            var finished = NewASTCompiler.ToExpression(templateName, environment, containerAssembled, out var newcompiler, rootScope);
            return(finished);
#else
            throw new NotImplementedException();
#endif
        }
Exemple #16
0
 internal MacroNode(JinjaEnvironment environment, ParsingNode?startParsingNode, string macroText, ContainerNode contents, ParsingNode?endParsingNode, WhiteSpaceControlSet?whiteSpace = null)
     : base(startParsingNode, contents.ParsingNodes, endParsingNode)
 {
     Contents          = contents;
     WhiteSpaceControl = whiteSpace ?? new WhiteSpaceControlSet();
     //MacroText = macroText;
     if (environment.Evaluation.TryParseFunctionDeclaration(macroText, out var functionDeclaration) == false || functionDeclaration == null)
     {
         throw new NotImplementedException();
     }
     FunctionDeclaration = functionDeclaration;
 }
Exemple #17
0
        public void TestInclude()
        {
            var environment = new JinjaEnvironment(new DictLoader(new Dictionary <string, string>
            {
                { "include", "{% macro test(foo) %}[{{ foo }}]{% endmacro %}" }
            }));
            dynamic template = new DynamicTemplateRenderer(
                environment.FromString("{% from \"include\" import test %}{{ test(\"foo\") }}")
                );

            MyAssert.AreEqual("[foo]", template.Render());
        }
Exemple #18
0
        internal static string CheckOriginalText(JinjaEnvironment environment, string templateText)
        {
            var     lexer          = new Lexer(environment);
            var     tokens         = lexer.Tokenize(templateText).ToArray();
            var     parsed         = Parser.Parse(tokens).ToArray();
            var     outputCombined = OutputCombiner.CombineOutput(parsed);
            ASTNode templateNode   = ASTGenerator.ParseTemplate(environment, lexer, outputCombined);

            var stringBuilder = new StringBuilder();

            templateNode.ToOriginalText(stringBuilder);
            return(stringBuilder.ToString());
        }
Exemple #19
0
        internal static ASTNode GetTemplateNode(JinjaEnvironment environment, string templateText)
        {
            var     lexer          = new Lexer(environment);
            var     tokens         = lexer.Tokenize(templateText).ToArray();
            var     parsed         = Parser.Parse(tokens).ToArray();
            var     outputCombined = OutputCombiner.CombineOutput(parsed);
            ASTNode templateNode   = ASTGenerator.ParseTemplate(environment, lexer, outputCombined);

            //templateNode = templateNode.Transform(CommentRemoverTransformer.Instance);
            templateNode = WhiteSpaceController.ControlWhiteSpace(environment, templateNode);

            return(templateNode);
        }
 internal static ASTNode ControlWhiteSpace(JinjaEnvironment environment, ASTNode templateNode)
 {
     if (environment.Settings.TrimBlocks)
     {
         templateNode.Transform(TrimBlocksVisitor.Instance);
     }
     if (environment.Settings.LStripBlocks)
     {
         templateNode.Transform(LStripBlocksVisitor.Instance);
     }
     templateNode.Transform(ManualWhiteSpaceVisitor.Instance);
     return(templateNode);
 }
Exemple #21
0
 internal static bool TryParse(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
 {
     parsedNode = _Delegates.Select(del =>
     {
         var Result = del(environment, lexer, enumerator, out var ParsedNode);
         return(new
         {
             Result,
             ParsedNode,
         });
     }).FirstOrDefault(res => res.Result)?.ParsedNode;
     return(parsedNode != default);
 }
Exemple #22
0
        internal static bool TryParseFor(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            ContainerNode? elseBlock  = null;
            ExpressionNode?filterNode = null;

            parsedNode = default;

            if (ForParser.StartBlock.TryParse(enumerator.Current, out var outsideStart, out var primaryInsideStart) == false)
            {
                return(false);
            }
            var primaryStartParsingNode = enumerator.Current;

            if (ForParser.StartBlock.TryGetAccumulations(ForParser.ForState.VariableNames, out var variableNames) == false || variableNames.Length == 0)
            {
                throw new NotImplementedException();
            }
            if (ForParser.StartBlock.TryGetAccumulation(ForParser.ForState.Expression, 0, out var expression) == false)
            {
                throw new NotImplementedException();
            }
            if (ForParser.StartBlock.TryGetAccumulation(ForParser.ForState.Filter, 0, out string?filter))
            {
                filterNode = ExpressionNode.FromString(environment, filter);
            }
            ForParser.StartBlock.TryGetVariable <bool>("recursive", out var recursive);
            enumerator.MoveNext();
            var primaryBlockChildren = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();

            ContainerNode primaryBlock;

            if (ForParser.ElseBlock.TryParse(enumerator.Current, out var primaryInsideEnd, out var elseInsideStart))
            {
                var elseStartParsingNode = enumerator.Current;
                enumerator.MoveNext();
                var elseBlockChildren = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();
                if (ForParser.EndBlock.TryParse(enumerator.Current, out var elseInsideEnd, out var outsideEnd) == false)
                {
                    throw new NotImplementedException();
                }

                primaryBlock = new ContainerNode(primaryStartParsingNode, primaryBlockChildren, null,
                                                 new WhiteSpaceControlSet(primaryInsideStart, primaryInsideEnd));
                elseBlock = new ContainerNode(elseStartParsingNode, elseBlockChildren, null,
                                              new WhiteSpaceControlSet(elseInsideStart, elseInsideEnd));
                parsedNode = new ForNode(primaryBlock, elseBlock, variableNames, ExpressionNode.FromString(environment, expression),
                                         filterNode, recursive, enumerator.Current, new WhiteSpaceControlSet(outsideStart, outsideEnd));
                return(true);
            }
Exemple #23
0
        public void ValidateValidVariables()
        {
            var templateString = "{{ a.ToString(\"O\") }}";
            var vars           = new Dictionary <string, object?>
            {
                { "a", DateTime.Now }
            };
            var environment = new JinjaEnvironment();
            //var result = environment.ValidateTemplateFromString(templateString);
            //Assert.AreEqual(true, result);
            var template = environment.FromString(templateString);
            var result   = template.Validate(vars);

            Assert.AreEqual(true, result);
        }
Exemple #24
0
 internal ExpressionNode(JinjaEnvironment environment, ParsingNode parsingNode,
                         WhiteSpaceMode startWhiteSpace, WhiteSpaceMode endWhiteSpace, string expression, string?ifClause, string?elseClause) : base(parsingNode)
 {
     Expression           = expression;
     ExpressionParserNode = environment.Evaluation.Parse(expression);
     if (ifClause != null)
     {
         IfClause = environment.Evaluation.Parse(ifClause);
     }
     if (elseClause != null)
     {
         ElseClause = new ExpressionNode(environment, elseClause);
     }
     WhiteSpaceControl = new WhiteSpaceControlSet(startWhiteSpace, endWhiteSpace);
 }
Exemple #25
0
        internal static TemplateNode ParseTemplate(JinjaEnvironment environment, Lexer lexer, IEnumerable <ParsingNode> source)
        {
            using var enumerator = LookaroundEnumeratorFactory.CreateLookaroundEnumerator(source, 10);

            while (enumerator.MoveNext())
            {
                var nodes = ParseUntilFailure(environment, lexer, enumerator).ToArray();
                if (enumerator.TryGetNext(out var nextNode))
                {
                    throw new NotImplementedException();
                }
                return(new TemplateNode(nodes));
            }

            throw new NotImplementedException();
        }
Exemple #26
0
        internal static bool TryParseInclude(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;
            if (IncludeParser.Parser.TryParse(enumerator.Current) == false)
            {
                return(false);
            }
            if (IncludeParser.Parser.TryGetAccumulation(IncludeParser.IncludeState.TemplateNames, 0, out var templateNames) == false)
            {
                throw new NotImplementedException();
            }
            var templateNamesExpression = ExpressionNode.FromString(environment, templateNames);

            var ignoreMissing = IncludeParser.Parser.GetVariable <bool>("ignoreMissing", false);
            var context       = IncludeParser.Parser.GetVariable <bool?>("context", null);

            parsedNode = new IncludeNode(enumerator.Current, templateNamesExpression, ignoreMissing, context);
            return(true);
        }
Exemple #27
0
        internal static bool TryParseImport(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;
            if (ImportParser.ParserImport.TryParse(enumerator.Current) == false)
            {
                return(false);
            }
            if (ImportParser.ParserImport.TryGetAccumulation(ImportParser.ImportState.Template, 0, out var template) == false)
            {
                throw new NotImplementedException();
            }
            if (ImportParser.ParserImport.TryGetAccumulation(ImportParser.ImportState.As, 0, out var asText) == false)
            {
                throw new NotImplementedException();
            }
            var templateNode = environment.Evaluation.Parse(template);

            parsedNode = new ImportNode(enumerator.Current, templateNode, asText);
            return(true);
        }
Exemple #28
0
        internal static IEnumerable <ASTNode> ParseUntilFailure(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator)
        {
            do
            {
                ASTNode?astNode = default;
                switch (enumerator.Current.NodeType)
                {
                case ParsingNodeType.Statement:
                    StatementNode.TryParse(environment, lexer, enumerator, out astNode);
                    break;

                case ParsingNodeType.NewLine:
                    astNode = new NewLineNode(enumerator.Current);
                    break;

                case ParsingNodeType.Comment:
                    astNode = new CommentNode(enumerator.Current);
                    break;

                case ParsingNodeType.WhiteSpace:
                    astNode = WhiteSpaceNode.Parse(enumerator);
                    break;

                case ParsingNodeType.Expression:
                    if (ExpressionNode.TryParse(environment, enumerator, out astNode) == false)
                    {
                        throw new NotImplementedException();
                    }
                    break;

                case ParsingNodeType.Output:
                    astNode = new OutputNode(enumerator.Current);
                    break;
                }
                if (astNode == default)
                {
                    yield break;
                }
                yield return(astNode);
            } while (enumerator.MoveNext());
        }
Exemple #29
0
        internal static bool TryParseSet(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;
            if (SetParser.StartBlock.TryParse(enumerator.Current) == false)
            {
                return(false);
            }
            var startParsingNode = enumerator.Current;

            if (SetParser.StartBlock.TryGetAccumulations(SetParser.SetState.VariableName, out var variableNames) == false)
            {
                throw new NotImplementedException();
            }
            if (variableNames == null || variableNames.Length == 0)
            {
                throw new NotImplementedException();
            }
            if (variableNames.Length != 1)
            {
                throw new NotImplementedException();                            // Not supported yet
            }
            if (SetParser.StartBlock.TryGetAccumulation(SetParser.SetState.AssignmentExpression, 0, out var assignmentExpression))
            {
                parsedNode = new SetNode(startParsingNode, variableNames, assignmentExpression, null);
                return(true);
            }

            enumerator.MoveNext();
            var contents = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();


            if (SetParser.EndBlock.TryParse(enumerator.Current) == false)
            {
                throw new NotImplementedException();
            }

            var contentsNode = new ContainerNode(null, contents, null);

            parsedNode = new SetNode(startParsingNode, variableNames, contentsNode, enumerator.Current);
            return(true);
        }
Exemple #30
0
        internal static bool TryParseCall(JinjaEnvironment environment, Lexer lexer, ILookaroundEnumerator <ParsingNode> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode)
        {
            parsedNode = default;


            if (CallParser.StartBlock.TryParse(enumerator.Current, out var outsideStart, out var insideStart) == false)
            {
                return(false);
            }
            if (CallParser.StartBlock.TryGetAccumulation(CallParser.CallState.CallDefinition, 0, out var callDefinition) == false)
            {
                throw new NotImplementedException();
            }
            var startParsingNode = enumerator.Current;

            enumerator.MoveNext();
            var contents = ASTGenerator.ParseUntilFailure(environment, lexer, enumerator).ToArray();

            if (CallParser.EndBlock.TryParse(enumerator.Current, out var insideEnd, out var outsideEnd) == false)
            {
                return(false);
            }
            var endParsingNode = enumerator.Current;
            var contentsNode   = new ContainerNode(null, contents, null,
                                                   new WhiteSpaceControlSet(insideStart, insideEnd)
                                                   );

            if (TryParseCallDefinition(lexer, callDefinition, out var callArgumentList, out var macroCall) == false)
            {
                throw new NotImplementedException();
            }


            parsedNode = new CallNode(startParsingNode,
                                      ExpressionNode.FromString(environment, callArgumentList),
                                      ExpressionNode.FromString(environment, macroCall), contentsNode, endParsingNode,
                                      new WhiteSpaceControlSet(outsideStart, outsideEnd)
                                      );
            return(true);
        }