Erweitern Inline-Tags in benutzerdefinierten Javadoc taglet
-
10-10-2019 - |
Frage
Ich schrieb eine benutzerdefinierte Javadoc taglet, die einen neuen note
Tag fügt hinzu:
...
public boolean isInlineTag() { return false; }
public String toString(Tag tag) {
return "<pre class='note'>" + tag.text() + "</pre>";
}
Es funktioniert so weit, aber Inline-Tags werden nicht erweitert. Hier ist ein Beispiel Kommentar:
/**
* @note Test note with {@link Someclass} // @link tag is NOT expanded
* @param name - here the {@link Someclass} works // works for standard 'param' tag
*/
Der {@link}
Inline-Tag wird nicht erweitert. Es ist jedoch gut für die eingebaute in param
javadoc Tag arbeitet.
Gibt es eine Möglichkeit verschachtelte Inline-Tags in einem benutzerdefinierten Javadoc taglet zu erweitern?
Danke!
Lösung
Die Taglet Überblick sagt :
Taglets kann entweder als Block-Tags geschrieben werden, wie @todo oder Inline-Tags wie {@underline}. Block Taglets derzeit nicht Inline-Tags in ihrem Text unterstützen.
In der Tat, die taglet API ist ein bisschen zu minimal, da er nur die toString()
Methode unterstützt.
Sie können innerhalb dieses Verfahren die Unter-Tags des Parameters tag
abrufen (mit .inlineTags()
), aber dann würden Sie haben sie selbst zu formatieren, da Sie Zugriff auf den normalen Maschinen der Standard doclet nicht von Ihrem taglet haben.
So, sieht aus wie Sie sind aus Glück hier, wenn Sie nicht wollen, neu zu implementieren (oder Kopie) Teile der Norm doclet in Ihrem eigenen taglet. (Aber dann könnte man das gleiche direkt den Standard doclet erweitern, anstatt sie mit Taglets Patchen.)
Andere Tipps
Hier drei mögliche Ideen, von denen keines Ich mag:
-
Statt der eigenen
Taglet
definieren, verwenden Sie die-tag
Option zumjavadoc
Befehl Unterstützung@note
. Natürlich wird dies nicht zulassen, definieren Sie Ihre eigene benutzerdefinierte Formatierung. -
Sie könnten
tag.holder().setRawCommentText(String)
verwenden. Meine Erfahrung spielt dabei ist, dass auf diese Weise können Sie Tags hinzufügen, aber Sie nicht läßt einen Tag neu schreiben. So können Sie einen String Ersatz auftag.holder().getRawCommentText()
nicht tun und dann die Standard-doclet die Inline-Tags richtig machen, aber Sie könnten wahrscheinlich IhreTaglet.toString(Tag[])
Methode, um die HTML zu erzeugen, einschließlich der Rohform der Inline-Tags, und dann Anfügen auf das rohe Kommentartext "@renderedNote
markedUp Tag.text () ", wo@renderedNote
anderer Tag ist, mit-tag
definiert. IhreTaglet.toString(Tag[])
sollte dann eine leere Zeichenfolge zurück. Doch nicht nur das ist hässlich, ich weiß nicht, ob dies auf undokumentierte Verhalten beruht und so weiß ich nicht, wie robust oder zukunftssicher ist diese Idee. -
könnten Sie haben Ihre
Taglet
auchcom.sun.tools.doclets.internal.toolkit.taglets.Taglet
implementieren. Dies scheint zu sein, wie die Standard-Taglets definiert. Die beiden Methoden, die Sie dann umsetzen müssen sindTagletOutput getTagletOutput(Tag tag, TagletWriter writer)
undTagletOutput getTagletOutput(Doc doc, TagletWriter writer)
. Ich denke, letzteres nurthrow IllegalArgumentException()
. Wenn Sie auch dieMap
halten zur Verfügung gestellt, wenn IhrTaglet
registriert wurde, dann können Sie in der Lage sein, mehrere der Inline-Tags zu machen, dass Sie durch Nachschlagen des Tag-Namen in diesemMap
zu bekommen ihre Umsetzungcom.sun.tools.doclets.internal.toolkit.taglets.Taglet
und Delegieren von seinergetTagletOutput
Methode begegnen. Allerdings sieht es aus wie zum Beispiel@link
-Tags nicht in dieser Karte eingetragen sind; für diejenigen, ist es möglich (aber ich habe nicht überprüft), dass, weil@link
Tags angeblich alsSeeTag
vorgesehen sind Sie in der Lage sein, die Karte von@see
zu verwenden, anstatt, oder man kann denTagletWriter
zuTagletWriterImpl
gegossen und dannTagletWriterImpl.seeTagOutput(Doc, SeeTag[])
verwenden. FürText
-Tags können SieTagletOutput
Instanzen übernew TagletOutputImpl(String)
erzeugen. Schließlich alleTagletOutput
Fällen, dass Sie auf diese Weise erhalten können in einem einzigenTagletOutput
kombiniert werdenTagletOutput.append(TagletOutput)
werden zurückgegeben werden.