我编写了一个自定义的Javadoc标记,它添加了一个新的note
标记:
...
public boolean isInlineTag() { return false; }
public String toString(Tag tag) {
return "<pre class='note'>" + tag.text() + "</pre>";
}
它到目前为止工作,但内联标签不会扩展。以下是一个示例评论:
/**
* @note Test note with {@link Someclass} // @link tag is NOT expanded
* @param name - here the {@link Someclass} works // works for standard 'param' tag
*/
{@link}
内联代码未展开。但是,它适用于内置的param
javadoc标记。
有没有办法在自定义Javadoc标记中扩展嵌套内联标记?
谢谢!
答案 0 :(得分:2)
Taglet可以写为块标记(如@todo)或内联标记(如{@underline})。块标记当前不支持其文本中的内联标记。
事实上,taglet API有点过于简单,因为它只支持toString()
方法。
你可以在这个方法中检索参数tag
的子标签(带.inlineTags()
),但是你必须自己格式化它们,因为你无法访问正常的机制标签中的标准doclet。
因此,如果您不想在自己的标记中重新实现(或复制)标准doclet的某些部分,那么看起来您运气不好。 (但是,你可以直接扩展标准doclet而不是用taglet修补它。)
答案 1 :(得分:1)
这里有三个可能的想法,我都不喜欢这些想法:
使用Taglet
命令的-tag
选项来支持javadoc
,而不是定义自己的@note
。当然,这不会让您定义自己的自定义格式。
您可以使用tag.holder().setRawCommentText(String)
。我使用它的经验是,这可以让你添加标签,但不允许你重写标签。因此,您无法在tag.holder().getRawCommentText()
上执行字符串替换,然后让标准doclet正确呈现内联标记,但您可能可以使用Taglet.toString(Tag[])
方法生成html,包括内联的原始形式标记,然后附加到原始评论文本“@renderedNote
markedUp Tag.text()”其中@renderedNote
是使用-tag
定义的另一个标记。然后你的Taglet.toString(Tag[])
应该返回一个空字符串。然而,这不仅是丑陋的,我不知道这是否依赖于无证件行为,所以我不知道这个想法有多么强大或未来证明。
您可以让Taglet
同时实施com.sun.tools.doclets.internal.toolkit.taglets.Taglet
。这似乎是标准taglet的定义方式。您必须实施的两种方法是TagletOutput getTagletOutput(Tag tag, TagletWriter writer)
和TagletOutput getTagletOutput(Doc doc, TagletWriter writer)
。我认为后者只能throw IllegalArgumentException()
。如果您在注册Map
时也保留了Taglet
,那么您可以通过在Map
中查找标记名称来呈现您遇到的几个内联标记得到它的实现com.sun.tools.doclets.internal.toolkit.taglets.Taglet
并委托给它的getTagletOutput
方法。但是,例如,@link
标签未在该地图中注册;对于那些,有可能(但我没有检查),因为@link
标签应该被提供为SeeTag
,您可能可以使用@see
中的地图,或者您可以投TagletWriter
到TagletWriterImpl
然后使用TagletWriterImpl.seeTagOutput(Doc, SeeTag[])
。对于Text
代码,您可以通过TagletOutput
生成new TagletOutputImpl(String)
个实例。最后,您通过这种方式获得的所有TagletOutput
个实例都可以合并为一个TagletOutput
,以便使用TagletOutput.append(TagletOutput)
返回。