展开自定义Javadoc标记中的内联标记

时间:2010-11-16 08:08:59

标签: java javadoc custom-tag taglet

我编写了一个自定义的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标记中扩展嵌套内联标记?

谢谢!

2 个答案:

答案 0 :(得分:2)

Taglet overview说:

  

Taglet可以写为块标记(如@todo)或内联标记(如{@underline})。块标记当前不支持其文本中的内联标记。

事实上,taglet API有点过于简单,因为它只支持toString()方法。

你可以在这个方法中检索参数tag的子标签(带.inlineTags()),但是你必须自己格式化它们,因为你无法访问正常的机制标签中的标准doclet。

因此,如果您不想在自己的标记中重新实现(或复制)标准doclet的某些部分,那么看起来您运气不好。 (但是,你可以直接扩展标准doclet而不是用taglet修补它。)

答案 1 :(得分:1)

这里有三个可能的想法,我都不喜欢这些想法:

  1. 使用Taglet命令的-tag选项来支持javadoc,而不是定义自己的@note。当然,这不会让您定义自己的自定义格式。

  2. 您可以使用tag.holder().setRawCommentText(String)。我使用它的经验是,这可以让你添加标签,但不允许你重写标签。因此,您无法在tag.holder().getRawCommentText()上执行字符串替换,然后让标准doclet正确呈现内联标记,但您可能可以使用Taglet.toString(Tag[])方法生成html,包括内联的原始形式标记,然后附加到原始评论文本“@renderedNote markedUp Tag.text()”其中@renderedNote是使用-tag定义的另一个标记。然后你的Taglet.toString(Tag[])应该返回一个空字符串。然而,这不仅是丑陋的,我不知道这是否依赖于无证件行为,所以我不知道这个想法有多么强大或未来证明。

  3. 您可以让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中的地图,或者您可以投TagletWriterTagletWriterImpl然后使用TagletWriterImpl.seeTagOutput(Doc, SeeTag[])。对于Text代码,您可以通过TagletOutput生成new TagletOutputImpl(String)个实例。最后,您通过这种方式获得的所有TagletOutput个实例都可以合并为一个TagletOutput,以便使用TagletOutput.append(TagletOutput)返回。