Разверните встроенные теги в пользовательском теге Javadoc

Я написал пользовательский тег 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 ответа

Решение

Обзор Taglet гласит:

Теглеты могут быть написаны либо как блочные теги, такие как @todo, либо как встроенные теги, такие как {@underline}. Блочные теги в настоящее время не поддерживают встроенные теги в их тексте.

На самом деле API-интерфейс taglet слишком минимален, поскольку он поддерживает только toString() метод.

Внутри этого метода вы можете получить подтэги параметра tag.inlineTags()), но тогда вам придется форматировать их самостоятельно, поскольку у вас нет доступа к обычному механизму стандартного доклета из вашего теглета.

Итак, похоже, вам здесь не повезло, если вы не хотите переопределять (или копировать) части стандартного доклета в своем собственном теге. (Но тогда вы можете напрямую расширить стандартный доклет вместо того, чтобы исправлять его тегами.)

Вот три возможных идеи, ни одна из которых мне не очень нравится:

  1. Вместо того, чтобы определять свой собственный Taglet, использовать -tag вариант к javadoc команда поддержки @note, Конечно, это не позволит вам определить собственное форматирование.

  2. Вы могли бы использовать tag.holder().setRawCommentText(String), Мой опыт игры с этим заключается в том, что это позволяет вам добавлять теги, но не позволяет переписывать теги. Таким образом, вы не можете сделать замену строки на tag.holder().getRawCommentText() Затем стандартный доклет правильно отображает встроенные теги, но вы можете Taglet.toString(Tag[]) метод генерирования HTML, включая необработанную форму встроенных тегов, а затем добавление к необработанному тексту комментария@renderedNote markUp 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 вместо этого, или вы могли бы разыграть TagletWriter в TagletWriterImpl а затем использовать TagletWriterImpl.seeTagOutput(Doc, SeeTag[]), За Text теги, вы можете генерировать TagletOutput экземпляры через new TagletOutputImpl(String), Наконец все TagletOutput случаи, которые вы получаете таким образом, могут быть объединены в один TagletOutput быть возвращенным с помощью TagletOutput.append(TagletOutput),

Другие вопросы по тегам