我正在使用“动态”Freemarker 模板,这意味着可以根据用户提交的输入进行更改的模板。我希望能够做两件事:
- 检查模板的解析语法树以查看其包含的内容,尤其是标识符和 ${variables}。
- 操作已解析的树,添加/删除元素。
现在,我正在通过一些丑陋的正则表达式和字符串操作来完成此任务。它丑陋且容易出错,所以我很想利用 Java 中的 Freemarker 模板表示。
根据 JavaDoc,Template.getRootTreeNode 似乎是我想要的开始:我可以检索模板的类似 DOM 的解析树,TemplateElement 的实例。但 TemplateElement 的许多具体实现并不是公开的。 JavaDoc 甚至没有记录 TemplateElement。看来我从 TemplateElement 获取有用信息的唯一方法是编写 Freemarker 包中的代码。是否有 Freemarker 祝福的方法来检查模板?
理想情况下,我们应该有 TemplateElement 层次结构的适当文档,并将其子类公开。虽然这不允许我直接修改模板,但至少可以让我检查模板的元素。
几年前也有人提出过以下问题,但结果有限:
How can I introspect a freemarker template to find out what variables it uses?
更新:
我已经启动了一个 Github 开源项目,以实现对解析的 Freemarker 模板的内省(introspection),以允许我上面讨论的那种编程分析和操作。欢迎反馈:
最佳答案
FreeMarker 目前没有用于检查模板的已发布 API,更不用说修改它们了。它会很有用,但它只是没有它。所以,我想知道你是否可以从不同的角度来解决这个问题。您说您正在动态生成模板,除非模板本身是用户提交的,否则您可以存储用户提交的信息(基于该信息生成模板),而不是模板本身......或类似的东西。
关于java - Freemarker 模板的自省(introspection)或操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23790515/