模板替换引擎(支持富文本动态表格)
- 前言
- 功能介绍
- example:
- 使用方法
- 函数扩展
- 系统函数
- 自定义函数
前言
分享一下自己开源的工具——模板替换引擎
https://github.com/RwTo/template-engine
可以拿来学习设计模式或使用
感兴趣的话,可以给个star
功能介绍
- 模板替换
${name} 替换为 rmw
- 动态表格生成
解析替换为
- 自定义函数执行与替换
$Now() 函数执行替换后为 当前时间 2024-09-15 00:10:00
example:
给定这样一个富文本字符串
$Now(yyyy-MM-dd)
$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)
这种配置是 函数替换
${student.name}
这种配置是 对象字段替换。如果是在表格中,会根据表格格式 动态生成表格
上述模板经过模板引擎的处理后,结果如下
使用方法
- 引入maven依赖
<dependency>
<groupId>io.github.rwto</groupId>
<artifactId>template-engine</artifactId>
<version>2.0.0</version>
</dependency>
- 构建动态对象
使用 @TemplateModel 和 @TemplateParam 构建模板替换参数
@TemplateModel("college")
@AllArgsConstructor
public class College {
@TemplateParam("name")
private String name;
@TemplateParam("grade")
private String grade;
}
@AllArgsConstructor
@TemplateModel("student")
public class Student {
@TemplateParam("id")
private Integer id;
@TemplateParam("name")
private String name;
@TemplateParam("age")
private Integer age;
@TemplateParam("subject")
private String subject;
public static List<Student> getData(){
List<Student> list = new ArrayList<>();
list.add(new Student(1,"rmw",24,"计算机"));
list.add(new Student(2,"wtt",25,"软件"));
list.add(new Student(3,"llt",27,"计网"));
list.add(new Student(4,"zze",34,"管理"));
return list;
}
}
@TemplateModel("teacher")
@AllArgsConstructor
public class Teacher {
@TemplateParam("name")
private String name;
@TemplateParam("age")
private Integer age;
@TemplateParam("entryDate")
private String entryTime;
public static List<Teacher> getData(){
List<Teacher> list = new ArrayList<>();
list.add(new Teacher("wzz",44, "2011-09-01 12:00:26"));
list.add(new Teacher("zgl",45, "2013-02-01 12:30:24"));
list.add(new Teacher("jjw",37, "2024-04-01 15:10:13"));
list.add(new Teacher("zxz",34, "2016-09-01 16:43:33"));
return list;
}
}
以Teacher 类 为例 经过解析获取的可替换参数为
teacher.name 使用方法:${teacher.name}
teacher.age 使用方法:${teacher.age}
teacher.entryDate 使用方法:${teacher.entryDate}
- 构建模板字符串
以下面的富文本为例:
对应富文本字符串:
当前时间:$Now(yyyy-MM-dd)
<br>
学院信息:${college.name}, 年级: ${college.grade}
<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th colspan="4">学生信息表</th>
</tr>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>专业</th>
<th>信息</th>
</tr>
<tr>
<td>${student.name}</td>
<td>${student.age}</td>
<td>${student.subject}</td>
<td>$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)</td>
</tr>
</table>
学院名称:${college.name}
<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th colspan="3">讲师信息表</th>
</tr>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>入职日期</th>
</tr>
<tr>
<td>${teacher.name}</td>
<td>${teacher.age}</td>
<td>$DateTimeFormat(${teacher.entryDate},yy-MM-dd)</td>
</tr>
<tr>
<td>李四</td>
<td>21</td>
<td>111</td>
</tr>
</table>
- 执行模板替换
public class TemplateEngineTest {
public static void main(String[] args){
String tmpl = "\n" +
"当前时间:$Now(yyyy-MM-dd)\n" +
"<br>\n" +
"学院信息:${college.name}, 年级: ${college.grade}\n" +
"\n" +
"<table border=\"1\" cellspacing=\"0\" cellpadding=\"8\">\n" +
" <tr>\n" +
" <th colspan=\"4\">学生信息表</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th>姓名</th>\n" +
" <th>年龄</th>\n" +
" <th>专业</th>\n" +
"\t\t\t<th>信息</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>${student.name}</td>\n" +
" <td>${student.age}</td>\n" +
" <td>${student.subject}</td>\n" +
"\t\t\t<td>$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)</td>\n" +
" </tr>\n" +
"</table>\n" +
"\t\n" +
"学院名称:${college.name}\n" +
"\t\n" +
"<table border=\"1\" cellspacing=\"0\" cellpadding=\"8\">\n" +
" <tr>\n" +
" <th colspan=\"3\">讲师信息表</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th>姓名</th>\n" +
" <th>年龄</th>\n" +
"\t\t\t<th>入职日期</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>${teacher.name}</td>\n" +
" <td>${teacher.age}</td>\n" +
"\t\t\t<td>$DateTimeFormat(${teacher.entryDate},yy-MM-dd)</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td>李四</td>\n" +
" <td>21</td>\n" +
"\t\t\t<td>111</td>\n" +
" </tr>\n" +
" </table>" +
"\t\n" +
"学院名称:${college.name}\n" +
"\t\n" ;
List<Student> students = Student.getData();
List<Teacher> teachers = Teacher.getData();
College college = new College("计算机学院", "21级");
TemplateEngine templateEngine = TemplateEngine.builder().build();
String content = templateEngine.parseTemplate(tmpl)
.convert(Arrays.asList(college, students, teachers));
System.out.println(content);
}
}
替换后的结果为
当前时间:2024-09-14
<br>
学院信息:计算机学院, 年级: 21级
<table border="1" cellspacing="0" cellpadding="8"><tr><th colspan="4">学生信息表</th></tr><tr><th>姓名</th><th>年龄</th><th>专业</th><th>信息</th></tr><tr><td>rmw</td><td>24</td><td>计算机</td><td><a href="http://xxx?id=1"><span style="color: #3484ff;">rmw的信息</span></a></td></tr><tr><td>wtt</td><td>25</td><td>软件</td><td><a href="http://xxx?id=2"><span style="color: #3484ff;">wtt的信息</span></a></td></tr><tr><td>llt</td><td>27</td><td>计网</td><td><a href="http://xxx?id=3"><span style="color: #3484ff;">llt的信息</span></a></td></tr><tr><td>zze</td><td>34</td><td>管理</td><td><a href="http://xxx?id=4"><span style="color: #3484ff;">zze的信息</span></a></td></tr></table>
学院名称:计算机学院
<table border="1" cellspacing="0" cellpadding="8"><tr><th colspan="3">讲师信息表</th></tr><tr><th>姓名</th><th>年龄</th><th>入职日期</th></tr><tr><td>wzz</td><td>44</td><td>11-09-01</td></tr><tr><td>zgl</td><td>45</td><td>13-02-01</td></tr><tr><td>jjw</td><td>37</td><td>24-04-01</td></tr><tr><td>zxz</td><td>34</td><td>16-09-01</td></tr><tr><td>李四</td><td>21</td><td>111</td></tr></table>
学院名称:计算机学院
函数扩展
系统函数
$Now(arg1)
当前时间
arg1 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss
$DateTimeFormat(arg1,arg2)
日期时间格式化
arg1 必填, 代表要转换的日期,格式必须为 yyyy-MM-dd HH:mm:ss
arg2 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss
$HyperLink(arg1,arg2)
超链接
arg1 必填, 代表 链接url
arg2 必填, 代表 <a> 标签的名称
例如
$Hyperlink(http://xxx?id=1,${student.name}的信息)
转换后为 :<a href="http://xxx?id=1"><span style="color: #3484ff;">${student.name}的信息</span></a>
自定义函数
模板函数 类图
可以实现 TemplateFunc 接口,自定义自己的函数
public class MyFunc extends AbstractTemplateFunc {
public MyFunc(String funcName) {
super(funcName);
}
@Override
public String execute(Object... args) {
return String.join("|", (String[]) args);
}
}
在构建模板引擎时,添加自定义函数
public class TemplateEngineTest {
public static void main(String[] args){
String tmpl = "asdf $MyFunc(1,2,3,4,asd,22)";
TemplateEngine templateEngine = TemplateEngine.builder()
//添加自定义函数
.addFunction("MyFunc",new MyFunc())
.build();
String content = templateEngine.parseTemplate(tmpl)
.convert(new ArrayList<>());
//输出: asdf 1|2|3|4|asd|22
System.out.println(content);
}
}