2010-11-16 90 views
4

我寫了一個定製的Javadoc Taglet的,增加了一個新的note標籤:展開定製的Javadoc聯標籤Taglet的

... 
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

的​​說:

Taglets可以寫爲任一的塊標記,如@todo,或內聯標籤,例如{@underline}。塊標籤目前不支持其文本中的內嵌標籤。

事實上,taglet API有點太小,因爲它只支持toString()方法。

您可以在此方法中檢索參數tag(含.inlineTags())的子標籤,但您必須自己格式化它們,因爲您無法從標籤中訪問標準doclet的普通機器。

因此,如果您不想在自己的小標籤中重新實現(或複製)標準doclet的某些部分,看起來您在這裏運氣不佳。 (但是,你可以在同一個直接擴展標準doclet而不是用taglets修補它。)

1

這裏有三種可能的想法,沒有一個我很喜歡:

  1. 而不是定義自己的Taglet ,請使用javadoc命令的-tag選項來支持@note。當然,這不會讓你定義自己的自定義格式。您可以使用tag.holder().setRawCommentText(String)。我的經驗是,這可以讓你添加標籤,但不會讓你重寫標籤。因此,您不能在tag.holder().getRawCommentText()上進行字符串替換,然後讓標準doclet正確地呈現嵌入式標籤,但您可能已經使用Taglet.toString(Tag[])方法生成了html,包括嵌入式標籤的原始形式,然後附加到原始評論文字「@renderedNotemarkedUp Tag.text()」其中@renderedNote是另一個標籤,使用-tag定義。您的Taglet.toString(Tag[])應該返回一個空字符串。然而,這不僅醜陋,我不知道這是否依賴無證行爲,所以我不知道這個想法有多強大或未來證明。

  2. 你可以讓你的Taglet也實現com.sun.tools.doclets.internal.toolkit.taglets.Taglet。這似乎是如何定義標準小標籤。然後您必須執行的兩種方法是TagletOutput getTagletOutput(Tag tag, TagletWriter writer)TagletOutput getTagletOutput(Doc doc, TagletWriter writer)。我認爲後者可以只是throw IllegalArgumentException()。如果您還保留Taglet註冊時提供的Map,則可以通過查找Map中的標籤名稱來獲取其實現com.sun.tools.doclets.internal.toolkit.taglets.Taglet並委託給其getTagletOutput方法的幾個內聯標籤。但是,例如,看起來像@link標籤未在該地圖中註冊;對於那些,這可能(但我沒有檢查),因爲@link標籤被假定爲SeeTag,您可以使用@see的地圖代替,或者您可以將TagletWriter轉換爲TagletWriterImpl,然後使用TagletWriterImpl.seeTagOutput(Doc, SeeTag[])。對於Text標籤,您可以通過new TagletOutputImpl(String)生成TagletOutput實例。最後,所有您以這種方式獲得的TagletOutput實例可合併成一個TagletOutput,使用TagletOutput.append(TagletOutput)返回。