当前位置: 首页 > article >正文

模板替换引擎(支持富文本动态表格)

模板替换引擎(支持富文本动态表格)

  • 前言
  • 功能介绍
    • example:
  • 使用方法
  • 函数扩展
    • 系统函数
    • 自定义函数

前言

分享一下自己开源的工具——模板替换引擎

https://github.com/RwTo/template-engine

可以拿来学习设计模式或使用

感兴趣的话,可以给个star

功能介绍

  1. 模板替换

${name} 替换为 rmw

  1. 动态表格生成

在这里插入图片描述
解析替换为
在这里插入图片描述

  1. 自定义函数执行与替换

$Now() 函数执行替换后为 当前时间 2024-09-15 00:10:00

example:

给定这样一个富文本字符串
在这里插入图片描述

$Now(yyyy-MM-dd)

$Hyperlink(http://xxx?id=${student.id},${student.name}的信息)
这种配置是 函数替换

${student.name}
这种配置是 对象字段替换。如果是在表格中,会根据表格格式 动态生成表格

上述模板经过模板引擎的处理后,结果如下
在这里插入图片描述

使用方法

  1. 引入maven依赖
<dependency>
    <groupId>io.github.rwto</groupId>
    <artifactId>template-engine</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 构建动态对象
    使用 @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}

  1. 构建模板字符串
    以下面的富文本为例:

在这里插入图片描述

对应富文本字符串:


当前时间:$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>
  1. 执行模板替换
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>	
学院名称:计算机学院

在这里插入图片描述

函数扩展

系统函数

  1. $Now(arg1) 当前时间

arg1 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss

  1. $DateTimeFormat(arg1,arg2) 日期时间格式化

arg1 必填, 代表要转换的日期,格式必须为 yyyy-MM-dd HH:mm:ss
arg2 可选,代表时间日期格式,默认是 yyyy-MM-dd HH:mm:ss

  1. $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);
    }
}

http://www.kler.cn/a/305839.html

相关文章:

  • 设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例
  • windows下qt5.12.11使用ODBC远程连接mysql数据库
  • 小白初入Android_studio所遇到的坑以及怎么解决
  • 工位管理优化:Spring Boot企业级系统
  • 深入浅出rust内存对齐
  • 自动驾驶系列—自动驾驶环境感知:Radar数据的应用与实践
  • 物体识别之微特征识别任务综述
  • Linux文件系统(下)
  • 红黑树前语
  • 存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)
  • Unity2D游戏入门
  • [项目][WebServer][解析错误处理]详细讲解
  • JVM字节码
  • MySQL通过备份恢复的方式搭建主从/重建从库
  • 删除Cookie原理
  • 【Unity】在Unity 3D中使用Spine开发2D动画
  • Java | Leetcode Java题解之第404题左叶子之和
  • SQL中的外键约束
  • 获取某宝拍立淘API接口:深度学习图像实现匹配和检索
  • WebGL系列教程八(GLSL着色器基础语法)
  • Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改
  • USB组合设备——鼠标+键盘(两个接口实现)
  • OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案
  • iPhone 16即将推出的5项苹果智能功能
  • Computer Vision的学习路线
  • 坐牢第三十八天(Qt)