package org.jtwig;
import org.jtwig.environment.*;
import org.jtwig.escape.EscapeEngine;
import org.jtwig.model.tree.Node;
import org.jtwig.render.RenderRequest;
import org.jtwig.render.context.RenderContext;
import org.jtwig.render.context.RenderContextHolder;
import org.jtwig.render.context.model.BlockContext;
import org.jtwig.renderable.RenderResult;
import org.jtwig.renderable.StreamRenderResult;
import org.jtwig.renderable.StringBuilderRenderResult;
import org.jtwig.resource.reference.ResourceReference;
import org.jtwig.value.context.IsolateParentValueContext;
import org.jtwig.value.context.JtwigModelValueContext;
import org.jtwig.value.context.MapValueContext;
import org.jtwig.value.context.ValueContext;
import java.io.File;
import java.io.OutputStream;
import static org.jtwig.resource.reference.ResourceReference.*;
public class JtwigTemplate {
public static final EnvironmentFactory ENVIRONMENT_FACTORY = new EnvironmentFactory();
public static JtwigTemplate inlineTemplate (String template) {
return inlineTemplate(template, new DefaultEnvironmentConfiguration());
}
public static JtwigTemplate inlineTemplate (String template, EnvironmentConfiguration configuration) {
return new JtwigTemplate(ENVIRONMENT_FACTORY.create(configuration), new ResourceReference(STRING, template));
}
public static JtwigTemplate classpathTemplate(String location) {
return classpathTemplate(location, new DefaultEnvironmentConfiguration());
}
public static JtwigTemplate classpathTemplate(String location, EnvironmentConfiguration environmentConfiguration) {
ResourceReference resourceReference = new ResourceReference(CLASSPATH, location);
Environment environment = ENVIRONMENT_FACTORY.create(environmentConfiguration);
return new JtwigTemplate(environment, resourceReference);
}
public static JtwigTemplate fileTemplate (String filename, EnvironmentConfiguration environmentConfiguration) {
Environment environment = ENVIRONMENT_FACTORY.create(environmentConfiguration);
ResourceReference resourceReference = new ResourceReference(FILE, filename);
return new JtwigTemplate(environment, resourceReference);
}
public static JtwigTemplate fileTemplate (String filename) {
return fileTemplate(filename, new DefaultEnvironmentConfiguration());
}
public static JtwigTemplate fileTemplate (File path, EnvironmentConfiguration environmentConfiguration) {
return fileTemplate(path.getAbsolutePath(), environmentConfiguration);
}
public static JtwigTemplate fileTemplate (File path) {
return fileTemplate(path, new DefaultEnvironmentConfiguration());
}
private final ResourceReference resource;
private final Environment environment;
public JtwigTemplate(Environment environment, ResourceReference resource) {
this.resource = resource;
this.environment = environment;
}
public String render(JtwigModel model) {
RenderResult result = new StringBuilderRenderResult();
render(model, result);
return result.content();
}
public void render(JtwigModel model, OutputStream outputStream) {
RenderResult result = new StreamRenderResult(outputStream, environment.getRenderEnvironment().getDefaultOutputCharset());
render(model, result);
}
private void render(JtwigModel model, RenderResult renderResult) {
RenderContext renderContext = RenderContext.create()
.start(ValueContext.class, new IsolateParentValueContext(new JtwigModelValueContext(model), MapValueContext.newContext()))
.start(EscapeEngine.class, environment.getEscapeEnvironment().getInitialEscapeEngine())
.start(ResourceReference.class, resource)
.start(BlockContext.class, BlockContext.newContext())
;
EnvironmentHolder.set(environment);
RenderContextHolder.set(renderContext);
Node node = environment.getParser().parse(environment, resource);
environment.getRenderEnvironment().getRenderNodeService()
.render(new RenderRequest(renderContext, environment), node)
.appendTo(renderResult);
renderContext.end(ValueContext.class);
renderContext.end(EscapeEngine.class);
renderContext.end(ResourceReference.class);
renderContext.end(BlockContext.class);
}
}