#documentation-generation #freemarker
#документация-генерация #freemarker
Вопрос:
У меня есть библиотека FreeMarker, которую я хочу поставлять с моим продуктом, и я ищу способ сгенерировать HTML-документацию для нее на основе комментариев в файле FTL (в стиле Javadoc).
Например, типичная функция в моей библиотеке написана как:
<#--
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 нет стандартного способа написания комментариев (такого как @param
или @returns
в Javadoc).
Я не возражаю против создания собственного решения для этого, но я заинтересован в использовании существующей системы, такой как Doxia (поскольку я использую Maven для сборки проекта) или, возможно, Doxygen, вместо того, чтобы писать что-то с нуля. В идеале я хотел бы написать только код для разбора комментариев и полагаться на что-то еще для обнаружения макросов и генерации структуры документа.
Я открыт для изменения формата моих комментариев, если это поможет.
Ответ №1:
В случае, если вы решите написать свой собственный генератор документов или интерфейс для FTL для существующего генератора документов, вы можете повторно использовать часть инфраструктуры синтаксического анализа FreeMarker:
Вы можете использовать Template.getRootTreeNode()
для извлечения узла AST верхнего уровня шаблона. Поскольку макросы и отвечающие комментарии должны быть прямыми дочерними элементами этого узла верхнего уровня (IIRC), перебор его дочерних элементов и приведение их к нужному подклассу AST node должен дать вам почти все, что вам нужно в отношении синтаксиса 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
То, как вы будете анализировать комментарий, зависит от вас 😉
Обновление: Нашел что-то под названием ftldoc
в моих резервных копиях и загрузил это на GitHub. Возможно, это то, что вы ищете…
Комментарии:
1. Все это звучало несколько знакомо, как будто я делал что-то подобное много лет назад, поэтому я погуглил и порылся в своих резервных копиях и действительно нашел свой старый проект под названием
ftldoc
, который генерирует HTML-документацию для файлов FTL. Я загружу ее куда-нибудь (может быть, на GitHub?) и опубликую ссылку здесь 🙂2. Спасибо, это было именно то, что я искал, я даже мог бы разветвить ее и добавить новые функции 🙂