package org.jtwig.integration.addon; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; import org.jtwig.integration.AbstractIntegrationTest; import org.jtwig.model.position.Position; import org.jtwig.model.tree.Node; import org.jtwig.parser.addon.AddonParserProvider; import org.jtwig.parser.parboiled.ParserContext; 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.node.AddonParser; import org.jtwig.render.RenderRequest; import org.jtwig.render.node.renderer.NodeRender; import org.jtwig.renderable.Renderable; import org.jtwig.renderable.impl.StringRenderable; import org.junit.Test; import org.parboiled.Rule; import java.util.Collection; import java.util.Collections; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.jtwig.environment.EnvironmentConfigurationBuilder.configuration; public class AddOnParserTest extends AbstractIntegrationTest { @Test public void addOn() throws Exception { String result = JtwigTemplate.inlineTemplate("{% hello %}", configuration() .parser().addonParserProviders().add(new AddonParserProvider() { @Override public Class<? extends AddonParser> parser() { return SimpleAddOnParser.class; } @Override public Collection<String> keywords() { return Collections.emptyList(); } }).and().and() .render().nodeRenders().add(SimpleAddOn.class, new AddOnNodeRender()).and().and() .build()).render(JtwigModel.newModel()); assertThat(result, is("Hello World!")); } public static class AddOnNodeRender implements NodeRender<SimpleAddOn> { @Override public Renderable render(RenderRequest renderRequest, SimpleAddOn node) { return new StringRenderable("Hello World!"); } } public static class SimpleAddOnParser extends AddonParser { public SimpleAddOnParser(ParserContext context) { super(SimpleAddOnParser.class, context); } @Override public Rule NodeRule() { PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class); LimitsParser limitsParser = parserContext().parser(LimitsParser.class); SpacingParser spacingParser = parserContext().parser(SpacingParser.class); return Sequence( positionTrackerParser.PushPosition(), limitsParser.startCode(), spacingParser.Spacing(), String("hello"), spacingParser.Spacing(), limitsParser.endCode(), push(new SimpleAddOn(positionTrackerParser.pop())) ); } } public static class SimpleAddOn extends Node { protected SimpleAddOn(Position position) { super(position); } } }