# 简易自定义表达式模板解析器 **Repository Path**: chentao106/SimpleExpressionInterpreter ## Basic Information - **Project Name**: 简易自定义表达式模板解析器 - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 2 - **Created**: 2019-11-19 - **Last Updated**: 2024-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #简易自定义表达式模板解析器 ## 为什么要造一个新轮子 * 在做企业IT项目时,经常会有用户提出动态生成邮件、PDF文件的需求。 * FreeMarker、Velocity虽然强大,但是面对的是专业人员,语法复杂灵活,并不适合开放给最终用户。 * 其它一些字符串模板引擎,又过于简单,难于按需、高效地与自己的代码逻辑集成。 ## 模板解析器应用场景 ### 用户需求 ```text 亲爱的XXX先生/女士 你好!欢迎加入XXX公司,你的部门是XXX,岗位职级XXX … 人事部 HR XXX先生/女士 ``` *其中XXX部分,都是需要根据参数,或者后台数据自动替换的内容* ### 模板设计 ```text 亲爱的${uid|userInfo|prop:name}${uid|userInfo|prop:gender|genderName} 你好!欢迎加入不存在公司,你的部门是${uid|department|prop:name},岗位职级${uid|position|prop:name} … 人事部 HR ${my|prop:name}${my|prop:gender|genderName} ``` #### 语法 * "${}":需要值替换的表达式,包含在"${"与"}"之间; * "|": 顺序串联单个表达式的多个函数调用,前一调用的值会作为后一调用的第一参数; * ":": 若调用有额外参数,则追加在":"之后; * ",": 若额外参数不止一个,参以","分隔。 #### 函数说明 * uid: 获取当前调用的目标用户id * userInfo: 根据用户id获取用户信息 * prop:name: 获取对象的"name"属性 * prop:gender: 获取对象的"gender"属性 * genderName: 获取性别的中文名 * department: 根据用户id获取所在部门信息 * position: 根据用户id获取其岗位信息 * my: 获取session中当前登录的用户信息 ## 实现过程 本项目的git提交记录完整展示了实现过程: 1. 创建代码框架及测试用例; 2. 提取字符器模板中的表达式; 3. 解析表达式调用链; 4. 实现表达式求值; 5. 组装代码实现模板求值。 ## 效果 * 参考单元测试,即可实现自己的函数; * 本工程已经具备打包为jar包使用的条件,通过创建SimpleExpressionInterpreter的实例,并注入自己的FunctionProvider来使用。 ## 后续工作 1. 模板求值采用replace会涉及内存分配,可以在解析表达式的同时,把模板片段也解析出来,在求值后整体进行一次拼字符串操作; 2. 解析器的创建可以引入Builder生成器,从而语法关键字可以实现运行时的动态指定。