Разверните встроенные теги в пользовательском теге 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()
), но тогда вам придется форматировать их самостоятельно, поскольку у вас нет доступа к обычному механизму стандартного доклета из вашего теглета.
Итак, похоже, вам здесь не повезло, если вы не хотите переопределять (или копировать) части стандартного доклета в своем собственном теге. (Но тогда вы можете напрямую расширить стандартный доклет вместо того, чтобы исправлять его тегами.)
Вот три возможных идеи, ни одна из которых мне не очень нравится:
Вместо того, чтобы определять свой собственный
Taglet
, использовать-tag
вариант кjavadoc
команда поддержки@note
, Конечно, это не позволит вам определить собственное форматирование.Вы могли бы использовать
tag.holder().setRawCommentText(String)
, Мой опыт игры с этим заключается в том, что это позволяет вам добавлять теги, но не позволяет переписывать теги. Таким образом, вы не можете сделать замену строки наtag.holder().getRawCommentText()
Затем стандартный доклет правильно отображает встроенные теги, но вы можетеTaglet.toString(Tag[])
метод генерирования HTML, включая необработанную форму встроенных тегов, а затем добавление к необработанному тексту комментария@renderedNote
markUp Tag.text ()"где@renderedNote
это другой тег, определенный с помощью-tag
, ВашTaglet.toString(Tag[])
должен затем вернуть пустую строку. Тем не менее, это не только уродливо, я не знаю, основано ли это на недокументированном поведении, и поэтому я не знаю, насколько надежна или надежна эта идея в будущем.Вы могли бы иметь
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)
,