4

我编写了一个自定义 Javadoc taglet,它添加了一个新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}联标记未展开。但是,它适用于内置的paramjavadoc 标记。

有没有办法在自定义 Javadoc 标签中扩展嵌套的内联标签?

谢谢!

4

2 回答 2

2

Taglet概述说:

Taglets 可以写成块标签,如@todo,或内联标签,如{@underline}。块 taglets 目前不支持其文本中的内联标签。

事实上,taglet API 有点太小了,因为它只支持toString()方法。

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

因此,如果您不想在自己的 taglet 中重新实现(或复制)标准 doclet 的部分内容,那么您在这里似乎不走运。(但是,您也可以直接扩展标准 doclet,而不是使用 taglet 对其进行修补。)

于 2011-02-25T17:25:40.223 回答
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。这似乎是标准小标签的定义方式。然后您必须实现的两种方法是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).

于 2011-03-13T18:14:04.400 回答