This commit is contained in:
Looly 2021-03-20 17:42:07 +08:00
parent 6d5ca7051b
commit 14ee7985a8
13 changed files with 196 additions and 28 deletions

View File

@ -3,11 +3,12 @@
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.6.2 (2021-03-19) # 5.6.2 (2021-03-20)
### 新特性 ### 新特性
* 【core 】 Validator增加车架号(车辆识别码)验证、驾驶证驾驶证档案编号的正则校验pr#280@Gitee * 【core 】 Validator增加车架号(车辆识别码)验证、驾驶证驾驶证档案编号的正则校验pr#280@Gitee
* 【core 】 CopyOptions增加propertiesFilterpr#281@Gitee * 【core 】 CopyOptions增加propertiesFilterpr#281@Gitee
* 【extra 】 增加Wit模板引擎支持
### Bug修复 ### Bug修复
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -112,6 +112,12 @@
</exclusions> </exclusions>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.febit.wit</groupId>
<artifactId>wit-core</artifactId>
<version>2.6.0</version>
<optional>true</optional>
</dependency>
<!-- 邮件 --> <!-- 邮件 -->
<dependency> <dependency>

View File

@ -1,7 +1,7 @@
/** /**
* Beetl实现 * Beetl实现模板引擎介绍见http://ibeetl.com/
* *
* @author looly * @author looly
* *
*/ */
package cn.hutool.extra.template.engine.beetl; package cn.hutool.extra.template.engine.beetl;

View File

@ -1,7 +1,7 @@
/** /**
* Jfinal家的Enjoy模板引擎实现 * Jfinal家的Enjoy模板引擎实现https://jfinal.com/doc/6-1
* *
* @author looly * @author looly
* *
*/ */
package cn.hutool.extra.template.engine.enjoy; package cn.hutool.extra.template.engine.enjoy;

View File

@ -1,7 +1,7 @@
/** /**
* Rythm实现 * Rythm实现http://www.rythmengine.org/
* *
* @author looly * @author looly
* *
*/ */
package cn.hutool.extra.template.engine.rythm; package cn.hutool.extra.template.engine.rythm;

View File

@ -1,7 +1,7 @@
/** /**
* Thymeleaf实现 * Thymeleaf实现https://www.thymeleaf.org/
* *
* @author looly * @author looly
* *
*/ */
package cn.hutool.extra.template.engine.thymeleaf; package cn.hutool.extra.template.engine.thymeleaf;

View File

@ -16,7 +16,7 @@ import java.util.Map;
/** /**
* Velocity模板包装 * Velocity模板包装
* *
* @author looly * @author looly
* *
*/ */
@ -25,20 +25,20 @@ public class VelocityTemplate extends AbstractTemplate implements Serializable {
private final org.apache.velocity.Template rawTemplate; private final org.apache.velocity.Template rawTemplate;
private String charset; private String charset;
/** /**
* 包装Velocity模板 * 包装Velocity模板
* *
* @param template Velocity的模板对象 {@link org.apache.velocity.Template} * @param template Velocity的模板对象 {@link org.apache.velocity.Template}
* @return {@link VelocityTemplate} * @return VelocityTemplate
*/ */
public static VelocityTemplate wrap(org.apache.velocity.Template template) { public static VelocityTemplate wrap(org.apache.velocity.Template template) {
return (null == template) ? null : new VelocityTemplate(template); return (null == template) ? null : new VelocityTemplate(template);
} }
/** /**
* 构造 * 构造
* *
* @param rawTemplate Velocity模板对象 * @param rawTemplate Velocity模板对象
*/ */
public VelocityTemplate(org.apache.velocity.Template rawTemplate) { public VelocityTemplate(org.apache.velocity.Template rawTemplate) {
@ -61,7 +61,7 @@ public class VelocityTemplate extends AbstractTemplate implements Serializable {
/** /**
* 将Map转为VelocityContext * 将Map转为VelocityContext
* *
* @param bindingMap 参数绑定的Map * @param bindingMap 参数绑定的Map
* @return {@link VelocityContext} * @return {@link VelocityContext}
*/ */
@ -69,7 +69,7 @@ public class VelocityTemplate extends AbstractTemplate implements Serializable {
final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap); final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap);
return new VelocityContext(map); return new VelocityContext(map);
} }
/** /**
* 加载可用的Velocity中预定义的编码 * 加载可用的Velocity中预定义的编码
*/ */

View File

@ -0,0 +1,84 @@
package cn.hutool.extra.template.engine.wit;
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 org.febit.wit.Engine;
import org.febit.wit.exceptions.ResourceNotFoundException;
/**
* Wit(http://zqq90.github.io/webit-script/)模板引擎封装
*
* @author looly
*/
public class WitEngine implements TemplateEngine {
private Engine engine;
// --------------------------------------------------------------------------------- Constructor start
/**
* 默认构造
*/
public WitEngine() {}
/**
* 构造
*
* @param config 模板配置
*/
public WitEngine(TemplateConfig config) {
init(config);
}
/**
* 构造
*
* @param engine {@link Engine}
*/
public WitEngine(Engine engine) {
init(engine);
}
// --------------------------------------------------------------------------------- Constructor end
@Override
public TemplateEngine init(TemplateConfig config) {
init(createEngine(config));
return this;
}
/**
* 初始化引擎
* @param engine 引擎
*/
private void init(Engine engine){
this.engine = engine;
}
@Override
public Template getTemplate(String resource) {
if(null == this.engine){
init(TemplateConfig.DEFAULT);
}
try {
return WitTemplate.wrap(engine.getTemplate(resource));
} catch (ResourceNotFoundException e) {
throw new TemplateException(e);
}
}
/**
* 创建引擎
*
* @param config 模板配置
* @return {@link Engine}
*/
private static Engine createEngine(TemplateConfig config) {
if (null == config) {
config = TemplateConfig.DEFAULT;
}
return Engine.create();
}
}

View File

@ -0,0 +1,54 @@
package cn.hutool.extra.template.engine.wit;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.extra.template.AbstractTemplate;
import org.febit.wit.Template;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.Writer;
import java.util.Map;
/**
* Wit模板实现
*
* @author looly
*/
public class WitTemplate extends AbstractTemplate implements Serializable{
private static final long serialVersionUID = 1L;
private final Template rawTemplate;
/**
* 包装Wit模板
*
* @param witTemplate Wit的模板对象 {@link Template}
* @return WitTemplate
*/
public static WitTemplate wrap(Template witTemplate) {
return (null == witTemplate) ? null : new WitTemplate(witTemplate);
}
/**
* 构造
*
* @param witTemplate Wit的模板对象 {@link Template}
*/
public WitTemplate(Template witTemplate) {
this.rawTemplate = witTemplate;
}
@Override
public void render(Map<?, ?> bindingMap, Writer writer) {
final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap);
rawTemplate.merge(map, writer);
}
@Override
public void render(Map<?, ?> bindingMap, OutputStream out) {
final Map<String, Object> map = Convert.convert(new TypeReference<Map<String, Object>>() {}, bindingMap);
rawTemplate.merge(map, out);
}
}

View File

@ -0,0 +1,7 @@
/**
* Wit实现http://zqq90.github.io/webit-script/
*
* @author looly
*
*/
package cn.hutool.extra.template.engine.wit;

View File

@ -3,4 +3,5 @@ cn.hutool.extra.template.engine.freemarker.FreemarkerEngine
cn.hutool.extra.template.engine.velocity.VelocityEngine cn.hutool.extra.template.engine.velocity.VelocityEngine
cn.hutool.extra.template.engine.rythm.RythmEngine cn.hutool.extra.template.engine.rythm.RythmEngine
cn.hutool.extra.template.engine.enjoy.EnjoyEngine cn.hutool.extra.template.engine.enjoy.EnjoyEngine
cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine
cn.hutool.extra.template.engine.wit.WitEngine

View File

@ -1,6 +1,7 @@
package cn.hutool.extra.template; package cn.hutool.extra.template;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.TemplateConfig.ResourceMode; import cn.hutool.extra.template.TemplateConfig.ResourceMode;
import cn.hutool.extra.template.engine.beetl.BeetlEngine; import cn.hutool.extra.template.engine.beetl.BeetlEngine;
import cn.hutool.extra.template.engine.enjoy.EnjoyEngine; import cn.hutool.extra.template.engine.enjoy.EnjoyEngine;
@ -8,6 +9,7 @@ import cn.hutool.extra.template.engine.freemarker.FreemarkerEngine;
import cn.hutool.extra.template.engine.rythm.RythmEngine; import cn.hutool.extra.template.engine.rythm.RythmEngine;
import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine; import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
import cn.hutool.extra.template.engine.velocity.VelocityEngine; import cn.hutool.extra.template.engine.velocity.VelocityEngine;
import cn.hutool.extra.template.engine.wit.WitEngine;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
@ -18,7 +20,7 @@ import java.util.Map;
/** /**
* 模板引擎单元测试 * 模板引擎单元测试
* *
* @author looly * @author looly
* *
*/ */
@ -77,7 +79,7 @@ public class TemplateUtilTest {
Template template = engine.getTemplate("hello,${name}"); Template template = engine.getTemplate("hello,${name}");
String result = template.render(Dict.create().set("name", "hutool")); String result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("hello,hutool", result); Assert.assertEquals("hello,hutool", result);
//ClassPath模板 //ClassPath模板
engine = TemplateUtil.createEngine( engine = TemplateUtil.createEngine(
new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(FreemarkerEngine.class)); new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(FreemarkerEngine.class));
@ -85,7 +87,7 @@ public class TemplateUtilTest {
result = template.render(Dict.create().set("name", "hutool")); result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("hello,hutool", result); Assert.assertEquals("hello,hutool", result);
} }
@Test @Test
public void velocityEngineTest() { public void velocityEngineTest() {
// 字符串模板 // 字符串模板
@ -94,7 +96,7 @@ public class TemplateUtilTest {
Template template = engine.getTemplate("你好,$name"); Template template = engine.getTemplate("你好,$name");
String result = template.render(Dict.create().set("name", "hutool")); String result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("你好,hutool", result); Assert.assertEquals("你好,hutool", result);
//ClassPath模板 //ClassPath模板
engine = TemplateUtil.createEngine( engine = TemplateUtil.createEngine(
new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(VelocityEngine.class)); new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(VelocityEngine.class));
@ -132,7 +134,7 @@ public class TemplateUtilTest {
Template template = engine.getTemplate("<h3 th:text=\"${message}\"></h3>"); Template template = engine.getTemplate("<h3 th:text=\"${message}\"></h3>");
String result = template.render(Dict.create().set("message", "Hutool")); String result = template.render(Dict.create().set("message", "Hutool"));
Assert.assertEquals("<h3>Hutool</h3>", result); Assert.assertEquals("<h3>Hutool</h3>", result);
//ClassPath模板 //ClassPath模板
engine = TemplateUtil.createEngine( engine = TemplateUtil.createEngine(
new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(ThymeleafEngine.class)); new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(ThymeleafEngine.class));
@ -140,7 +142,7 @@ public class TemplateUtilTest {
result = template.render(Dict.create().set("message", "Hutool")); result = template.render(Dict.create().set("message", "Hutool"));
Assert.assertEquals("<h3>Hutool</h3>", result); Assert.assertEquals("<h3>Hutool</h3>", result);
} }
@Test @Test
@Ignore @Ignore
public void renderToFileTest() { public void renderToFileTest() {
@ -152,4 +154,13 @@ public class TemplateUtilTest {
File outputFile = new File("e:/test.txt"); File outputFile = new File("e:/test.txt");
template.render(bindingMap, outputFile); template.render(bindingMap, outputFile);
} }
@Test
public void WitEngineTest() {
TemplateEngine engine = TemplateUtil.createEngine(
new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(WitEngine.class));
Template template = engine.getTemplate("/templates/wit_test.wit");
String result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("hello,hutool", StrUtil.trim(result));
}
} }

View File

@ -0,0 +1,4 @@
<%
var name;
%>
hello,${name}