package org.jtwig.parser.parboiled.node; import org.jtwig.model.expression.InjectableExpression; import org.jtwig.model.tree.FilterNode; import org.jtwig.parser.parboiled.ParserContext; import org.jtwig.parser.parboiled.base.LexicParser; import org.jtwig.parser.parboiled.base.LimitsParser; import org.jtwig.parser.parboiled.base.PositionTrackerParser; import org.jtwig.parser.parboiled.base.SpacingParser; import org.jtwig.parser.parboiled.expression.BinaryOperationExpressionParser; import org.jtwig.parser.parboiled.expression.ExpressionParser; import org.jtwig.parser.parboiled.expression.FunctionExpressionParser; import org.jtwig.parser.parboiled.expression.VariableExpressionParser; import org.jtwig.parser.parboiled.model.Keyword; import org.parboiled.Rule; import static org.parboiled.Parboiled.createParser; public class FilterNodeParser extends NodeParser<FilterNode> { public FilterNodeParser(ParserContext context) { super(FilterNodeParser.class, context); createParser(FilterExpressionParser.class, context); } @Override public Rule NodeRule() { PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class); LimitsParser limitsParser = parserContext().parser(LimitsParser.class); SpacingParser spacingParser = parserContext().parser(SpacingParser.class); LexicParser lexicParser = parserContext().parser(LexicParser.class); FilterExpressionParser filterExpressionParser = parserContext().parser(FilterExpressionParser.class); CompositeNodeParser compositeNodeParser = parserContext().parser(CompositeNodeParser.class); return Sequence( positionTrackerParser.PushPosition(), // start Sequence( limitsParser.startCode(), spacingParser.Spacing(), lexicParser.Keyword(Keyword.FILTER), spacingParser.Spacing(), filterExpressionParser.ExpressionRule(), spacingParser.Spacing(), limitsParser.endCode() ), // content compositeNodeParser.NodeRule(), // end Sequence( limitsParser.startCode(), spacingParser.Spacing(), lexicParser.Keyword(Keyword.END_FILTER), spacingParser.Spacing(), limitsParser.endCode() ), push(new FilterNode(positionTrackerParser.pop(2), compositeNodeParser.pop(), filterExpressionParser.pop())) ); } public static class FilterExpressionParser extends ExpressionParser<InjectableExpression> { public FilterExpressionParser(ParserContext context) { super(FilterExpressionParser.class, context); } @Override public Rule ExpressionRule() { return FirstOf( parserContext().parser(BinaryOperationExpressionParser.class).ExpressionRule(), parserContext().parser(FunctionExpressionParser.class).ExpressionRule(), parserContext().parser(VariableExpressionParser.class).ExpressionRule() ); } } }