mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
hutool-extra模板引擎增加pebble引擎支持。Pebble是一款受Twig启发的Java模板引擎。它具有模板继承和易于阅读的语法,内置有安全的autoescaping,并包括对国际化的综合支持。
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
package cn.hutool.extra.template.engine.pebble;
|
||||
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.reflect.TypeReference;
|
||||
import cn.hutool.extra.template.Template;
|
||||
import cn.hutool.extra.template.TemplateException;
|
||||
import cn.hutool.extra.template.engine.velocity.VelocityTemplate;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author:zooooooooy
|
||||
*/
|
||||
public class PebbleTemplate implements Template {
|
||||
|
||||
private final io.pebbletemplates.pebble.template.PebbleTemplate template;
|
||||
|
||||
public PebbleTemplate(io.pebbletemplates.pebble.template.PebbleTemplate template) {
|
||||
this.template = template;
|
||||
}
|
||||
|
||||
/**
|
||||
* 包装pebbleTemplate模板
|
||||
* @param template
|
||||
* @return
|
||||
*/
|
||||
public static PebbleTemplate wrap(final io.pebbletemplates.pebble.template.PebbleTemplate template) {
|
||||
return (null == template) ? null : new PebbleTemplate(template);
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染对象
|
||||
* @param bindingMap 绑定的参数,此Map中的参数会替换模板中的变量
|
||||
* @param writer 输出
|
||||
*/
|
||||
@Override
|
||||
public void render(Map<?, ?> bindingMap, Writer writer) {
|
||||
|
||||
final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap);
|
||||
try {
|
||||
this.template.evaluate(writer, map);
|
||||
} catch (Exception e) {
|
||||
throw new TemplateException("pebble template parse failed, cause by: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染对象
|
||||
* @param bindingMap 绑定的参数,此Map中的参数会替换模板中的变量
|
||||
* @param out 输出
|
||||
*/
|
||||
@Override
|
||||
public void render(Map<?, ?> bindingMap, OutputStream out) {
|
||||
|
||||
final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap);
|
||||
try {
|
||||
this.template.evaluate(new OutputStreamWriter(out), map);
|
||||
} catch (Exception e) {
|
||||
throw new TemplateException("pebble template parse failed, cause by: ", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,122 @@
|
||||
package cn.hutool.extra.template.engine.pebble;
|
||||
|
||||
import cn.hutool.core.io.file.FileUtil;
|
||||
import cn.hutool.core.text.StrUtil;
|
||||
import cn.hutool.extra.template.Template;
|
||||
import cn.hutool.extra.template.TemplateConfig;
|
||||
import cn.hutool.extra.template.TemplateEngine;
|
||||
import cn.hutool.extra.template.TemplateException;
|
||||
import io.pebbletemplates.pebble.PebbleEngine;
|
||||
import io.pebbletemplates.pebble.error.PebbleException;
|
||||
import io.pebbletemplates.pebble.loader.ClasspathLoader;
|
||||
import io.pebbletemplates.pebble.loader.FileLoader;
|
||||
import io.pebbletemplates.pebble.loader.StringLoader;
|
||||
import org.beetl.core.GroupTemplate;
|
||||
|
||||
/**
|
||||
* @author:zooooooooy
|
||||
*/
|
||||
public class PebbleTemplateEngine implements TemplateEngine {
|
||||
|
||||
private PebbleEngine engine;
|
||||
|
||||
public PebbleTemplateEngine() {
|
||||
}
|
||||
|
||||
public PebbleTemplateEngine(TemplateConfig config) {
|
||||
init(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemplateEngine init(TemplateConfig config) {
|
||||
init(createEngine(config));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化引擎
|
||||
* @param engine 引擎
|
||||
*/
|
||||
private void init(PebbleEngine engine){
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建引擎
|
||||
*
|
||||
* @param config 模板配置
|
||||
* @return {@link GroupTemplate}
|
||||
*/
|
||||
private static PebbleEngine createEngine(TemplateConfig config) {
|
||||
if (null == config) {
|
||||
config = TemplateConfig.DEFAULT;
|
||||
}
|
||||
|
||||
PebbleEngine pebbleEngine;
|
||||
switch (config.getResourceMode()) {
|
||||
case CLASSPATH:
|
||||
ClasspathLoader classpathLoader = new ClasspathLoader();
|
||||
classpathLoader.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
|
||||
pebbleEngine = new PebbleEngine.Builder()
|
||||
.loader(classpathLoader)
|
||||
.autoEscaping(false)
|
||||
.build();
|
||||
break;
|
||||
case FILE:
|
||||
FileLoader fileLoader = new FileLoader();
|
||||
fileLoader.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
|
||||
pebbleEngine = new PebbleEngine.Builder()
|
||||
.loader(fileLoader)
|
||||
.autoEscaping(false)
|
||||
.build();
|
||||
break;
|
||||
case WEB_ROOT:
|
||||
fileLoader = new FileLoader();
|
||||
fileLoader.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/"));
|
||||
pebbleEngine = new PebbleEngine.Builder()
|
||||
.loader(fileLoader)
|
||||
.autoEscaping(false)
|
||||
.build();
|
||||
break;
|
||||
case STRING:
|
||||
StringLoader stringLoader = new StringLoader();
|
||||
stringLoader.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
|
||||
pebbleEngine = new PebbleEngine.Builder()
|
||||
.loader(stringLoader)
|
||||
.autoEscaping(false)
|
||||
.build();
|
||||
break;
|
||||
default:
|
||||
classpathLoader = new ClasspathLoader();
|
||||
classpathLoader.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
|
||||
pebbleEngine = new PebbleEngine.Builder()
|
||||
.loader(classpathLoader)
|
||||
.autoEscaping(false)
|
||||
.build();
|
||||
break;
|
||||
}
|
||||
|
||||
return pebbleEngine;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过路径获取对应模板操作类
|
||||
* @param resource 资源,根据实现不同,此资源可以是模板本身,也可以是模板的相对路径
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Template getTemplate(String resource) {
|
||||
|
||||
if (null == this.engine) {
|
||||
init(TemplateConfig.DEFAULT);
|
||||
}
|
||||
|
||||
return PebbleTemplate.wrap(engine.getTemplate(resource));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getRawEngine() {
|
||||
return this.engine;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* pebble template实现,模板引擎介绍见:https://github.com/PebbleTemplates/pebble
|
||||
*
|
||||
* @author zooooooooy
|
||||
*/
|
||||
package cn.hutool.extra.template.engine.pebble;
|
Reference in New Issue
Block a user