Java Freemarker模板的内省或操作

Java Freemarker模板的内省或操作,java,freemarker,Java,Freemarker,我正在使用“动态”Freemarker模板,这意味着可以根据用户提交的输入进行更改的模板。我希望能够做两件事: 检查模板的已解析语法树以查看其包含的内容,尤其是标识符和${variables} 操作已解析的树,添加/删除元素 现在,我正在通过一些丑陋的正则表达式和字符串操作来实现这一点。它丑陋且容易出错,所以我想利用Freemarker在Java中的模板表示 根据JavaDoc,Template.getRootTreeNode似乎是我想要的东西的开始:我可以检索模板的类似DOM的解析树,Temp

我正在使用“动态”Freemarker模板,这意味着可以根据用户提交的输入进行更改的模板。我希望能够做两件事:

  • 检查模板的已解析语法树以查看其包含的内容,尤其是标识符和${variables}
  • 操作已解析的树,添加/删除元素
  • 现在,我正在通过一些丑陋的正则表达式和字符串操作来实现这一点。它丑陋且容易出错,所以我想利用Freemarker在Java中的模板表示

    根据JavaDoc,Template.getRootTreeNode似乎是我想要的东西的开始:我可以检索模板的类似DOM的解析树,TemplateElement的实例。但是TemplateElement的许多具体实现都不是公共的。JavaDoc甚至没有文档TemplateElement。看来,从TemplateElement获得有用信息的唯一方法是编写Freemarker包中的代码。有没有检查模板的方法

    理想情况下,我们应该有TemplateElement层次结构的适当文档,并将其子类公开。虽然这不允许我直接修改模板,但至少可以让我检查模板的元素

    几年前还提出了以下问题,但结果有限:

    更新

    我已经启动了一个Github开源项目,以支持对已解析的Freemarker模板进行内省,从而实现我上面讨论的那种编程分析和操作。欢迎反馈:


    FreeMarker目前没有发布用于检查模板的API,更不用说修改模板了。它会很有用,但它就是没有。所以,我想知道你能否从另一个角度来解决这个问题。您说您正在动态生成模板,除非模板本身是用户提交的,否则您可以存储用户提交的信息,根据这些信息生成模板,而不是模板本身。。。或者类似的东西。

    谢谢您的回复。不幸的是,模板本身是用户提交的。看起来Freemarker当前状态的解决方案是在Freemarker.core包中编写自己的类,以访问包本地类和字段,特别是TemplateElement的子类。您认为Freemarker维护者会接受使用公共getter为不可访问字段公开这些类的更改吗?我在哪里能进行这样的谈话?谢谢。我现在是FreeMarker的维护者。我同意这样一个API是有用的,但是。。。我有一个庞大的待办事项清单,时间非常有限。而且TODO列表中的某些内容会影响更多用户(例如,正确的地图处理)。为类似的东西添加公共API在将来很容易成为另一个向后兼容的障碍,如果做得不好。。。所以,这件事不可能很快发生。我能理解你需要优先考虑。如果我们能想出一个你能同意的方法,我很乐意做这项工作。我们应该在FreeMarker开发者邮件列表上讨论这个问题。