为 FreeMarker FTL 库生成 HTML 文档

Posted

技术标签:

【中文标题】为 FreeMarker FTL 库生成 HTML 文档【英文标题】:Generate HTML documentation for a FreeMarker FTL library 【发布时间】:2011-09-12 03:01:54 【问题描述】:

我有一个 FreeMarker 库,我想随我的产品一起发布,我正在寻找一种方法来根据 FTL 文件中的 cmets(以 Javadoc 方式)为其生成 html 文档。

例如,我库中的一个典型函数是这样写的:

<#--
  MyMacro: Does stuff with param1 and param2.
  - param1: The first param, mandatory.
  - param2: The second param, 42 if not specified.
-->
<#macro MyMacro param1 param2=42>
  ...
</#macro>

我没有找到关于该主题的任何内容,可能是因为在 FreeMarker 中没有编写 cmets 的标准方法(例如 Javadoc 中的 @param@returns)。

我不介意为此推出自己的解决方案,但我热衷于使用现有系统,例如 Doxia(因为我使用 Maven 来构建项目)或 Doxygen,而不是从头开始编写一些东西。 理想情况下,我只想编写注释解析代码,并依靠其他东西来检测宏并生成文档结构。

如果有帮助,我愿意更改我的 cmets 的格式。

【问题讨论】:

【参考方案1】:

如果您决定编写自己的文档生成器或为现有文档生成器编写特定于 FTL 的前端,您可以重用 FreeMarker 的一些解析基础架构:

您可以使用Template.getRootTreeNode() 来检索模板的***AST 节点。因为宏和响应的 cmets 应该是这个***节点 (IIRC) 的直接子节点,所以迭代它的子节点并将它们转换为正确的 AST 节点子类应该可以为您提供几乎所有关于 FTL 语法所需的一切。为了说明我编写了一个小“演示”的方法(cfg 是一个普通的 FreeMarker Configuration 对象):

Template t = cfg.getTemplate("foo.ftl");
TemplateElement te = t.getRootTreeNode();

Enumeration e = te.children();
while(e.hasMoreElements()) 
    Object child = e.nextElement();
    if(child instanceof Comment) 
        Comment comment = (Comment)child;
        System.out.println("COMMENT: " + comment.getText());
     else if(child instanceof Macro) 
        Macro macro = (Macro)child;
        System.out.println("MACRO: " + macro.getName());
        for(String argumentName : macro.getArgumentNames()) 
            System.out.println("- PARAM: " + argumentName);
        
    

为您给定的示例宏生成:

COMMENT: 
  MyMacro: Does stuff with param1 and param2.
  - param1: The first param, mandatory.
  - param2: The second param, 42 if not specified.

MACRO: MyMacro
- PARAM: param1
- PARAM: param2

如何解析评论取决于你 ;-)

更新:在我的备份和 uploaded it to GitHub 中发现了一个名为 ftldoc 的东西。也许这就是你要找的……

【讨论】:

这一切听起来有些熟悉,好像我多年前做过类似的事情,所以我用谷歌搜索并搜索了我的备份,确实找到了我的一个旧项目,名为ftldoc,它为 FTL 生成 HTML 文档文件。我会把它上传到某个地方(也许是 GitHub?)并在这里发布一个链接 :-) 谢谢,这正是我想要的,我什至可以分叉它并添加新功能:)

以上是关于为 FreeMarker FTL 库生成 HTML 文档的主要内容,如果未能解决你的问题,请参考以下文章

.ftl文件 是啥文件

Freemarker 模板从路径 WEB-INF\ftl\ 访问 Freemarker 文件

使用FreeMarker生成Word文档

FreeMarker的FTL模板里怎么遍历list

freemarker

ftl文件 是啥文件