    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.taglet;
    017
    018import com.sun.tools.doclets.Taglet;
    019
    020/**
    021 * ソースコメントから、Javadoc を作成する場合のカスタムタグ情報を作成する
    022 * Taglet インターフェースのAbstract 実装クラスを作成します。
    023 * デフォルトの タグレットとしての初期値を設定します。
    024 * つまり、isInlineTag() のみ false を返すメソッドを定義してあります。
    025 *
    026 * @version  4.0
    027 * @author   Kazuhiko Hasegawa
    028 * @since    JDK5.0,
    029 */
    030public abstract class AbstractTaglet implements Taglet {
    031
    032        /**
    033         * このタグレットがフィールドドキュメンテーションで
    034         * 使用されている場合、true を返します。
    035         * インラインタグについては false が設定されます。
    036         *
    037         * @return フィールドドキュメンテーションの場合は true、そうでない場合は false を返します
    038         */
    039        public boolean inField() {
    040                return true;
    041        }
    042
    043        /**
    044         * このタグレットがコンストラクタドキュメンテーションで
    045         * 使用されている場合、true を返します。
    046         * インラインタグについては false が設定されます。
    047         *
    048         * @return コンストラクタドキュメンテーションの場合は true、そうでない場合は false を返します
    049         */
    050        public boolean inConstructor() {
    051                return true;
    052        }
    053
    054        /**
    055         * このタグレットがメソッドドキュメンテーションで
    056         * 使用されている場合、true を返します。
    057         * インラインタグについては false が設定されます。
    058         *
    059         * @return メソッドドキュメンテーションの場合は true、そうでない場合は false を返します
    060         */
    061        public boolean inMethod() {
    062                return true;
    063        }
    064
    065        /**
    066         * このタグレットが概要ドキュメンテーションで
    067         * 使用されている場合、true を返します。
    068         * インラインタグについては false が設定されます。
    069         *
    070         * @return 概要ドキュメンテーションの場合は true、そうでない場合は false を返します
    071         */
    072        public boolean inOverview() {
    073                return true;
    074        }
    075
    076        /**
    077         * このタグレットがパッケージドキュメンテーションで
    078         * 使用されている場合、true を返します。
    079         * インラインタグについては false が設定されます。
    080         *
    081         * @return パッケージドキュメンテーションの場合は true、そうでない場合は false を返します
    082         */
    083        public boolean inPackage() {
    084                return true;
    085        }
    086
    087        /**
    088         * このタグレットがタイプドキュメンテーションで
    089         * 使用されている場合、true を返します。
    090         * インラインタグについては false が設定されます。
    091         *
    092         * @return タイプドキュメンテーションの場合は true、そうでない場合は false を返します
    093         */
    094        public boolean inType() {
    095                return true;
    096        }
    097
    098        /**
    099         * このタグレットがインラインタグで
    100         * 使用されている場合、true を返します。
    101         * そうでない場合については false が設定されます。
    102         *
    103         * @return インラインタグの場合は true、そうでない場合は false を返します
    104         */
    105        public boolean isInlineTag() {
    106                return false;
    107        }
    108
    109        /**
    110         * このタグレットがインラインタグで {&#064;link XXXX YYYY} を処理するように
    111         * 用意された、カスタムメソッドです。
    112         *
    113         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
    114         *
    115         * @param       in      オリジナルの文字列
    116         *
    117         * @return      インラインタグの link を処理した結果の文字列
    118         */
    119        protected String link( final String in ) {
    120                if( in == null ) { return ""; }
    121                int index = in.indexOf( "{@link" );
    122                if( index < 0 ) { return in; }
    123
    124                StringBuilder rtn = new StringBuilder();
    125                int start = 0;
    126                while( index >= 0 ) {
    127                        int end = in.indexOf( '}',index );
    128
    129                        // {@ より前方の文字列を追加
    130                        if( index > 0 ) { rtn.append( in.substring( start,index ) ); }
    131
    132                        // {@link XXXX YY} の XXXX YY部分を処理
    133                        String val = in.substring( index+7,end );
    134                        if( val != null ) {
    135                                int sp = val.indexOf( ' ' );
    136                                String xxx = val.substring( 0,sp ).trim();      // 前半：アドレス変換
    137                                String yyy = val.substring( sp ).trim();        // 後半：ラベル
    138                                String zzz = xxx.replace( '.','/' );
    139                                rtn.append( "<a href=\"../../../../" ).append( zzz ).append( ".html\" " )
    140                                        .append( "title=\"" ).append( xxx ).append( "\">" )
    141                                        .append( yyy ).append( "</a>" );
    142                        }
    143
    144                        start = end+1 ;
    145                        index = in.indexOf( "{@",start );
    146                }
    147                rtn.append( in.substring( start ) );
    148
    149                return rtn.toString();
    150        }
    151}