    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.javadoc.Tag;
    019
    020import org.opengion.fukurou.util.FileUtil;
    021import org.opengion.fukurou.util.StringUtil;
    022
    023import java.io.File;
    024import java.io.PrintWriter;
    025import java.io.IOException;
    026
    027/**
    028 * Tag 情報を出力する PrintWriter 相当クラスです。
    029 *
    030 * @version  4.0
    031 * @author   Kazuhiko Hasegawa
    032 * @since    JDK5.0,
    033 */
    034public final class DocletTagWriter {
    035        private final PrintWriter outFile ;
    036        private final boolean rtn2br ;                  // 改行コードを <br/>に置換するかどうか
    037
    038        private static final String ENCODE = "UTF-8" ;
    039
    040        /** リターンコード  System.getProperty("line.separator")  */
    041        public static final String CR = System.getProperty("line.separator");
    042        /** HTML上のブレーク  &lt;br&gt; + CR  */
    043        public static final String BR = "&lt;br&gt;" + CR ;
    044
    045        /**
    046         * Doclet のエントリポイントメソッドです。
    047         *
    048         * 初期エンコードで出力します。
    049         *
    050         * @param file  出力ファイル名
    051         * @throws IOException なんらかのエラーが発生した場合。
    052         */
    053        public DocletTagWriter( final String file ) throws IOException {
    054                this( file,ENCODE,false );
    055        }
    056
    057        /**
    058         * Doclet のエントリポイントメソッドです。
    059         *
    060         * @param file          出力ファイル名
    061         * @param encode        エンコード
    062         * @throws IOException なんらかのエラーが発生した場合。
    063         */
    064        public DocletTagWriter( final String file,final String encode ) throws IOException {
    065                this( file,encode,false );
    066        }
    067
    068        /**
    069         * Doclet のエントリポイントメソッドです。
    070         *
    071         * @param file          出力ファイル名
    072         * @param encode        エンコード
    073         * @param r2b           改行コードを BRタグに置換するかどうか
    074         * @throws IOException なんらかのエラーが発生した場合。
    075         */
    076        public DocletTagWriter( final String file,final String encode,final boolean r2b ) throws IOException {
    077                outFile = FileUtil.getPrintWriter( new File( file ),encode );
    078                rtn2br = r2b;
    079        }
    080
    081        /**
    082         * 出力ファイルをクロースします。
    083         *
    084         */
    085        public void close() {
    086                outFile.close();
    087        }
    088
    089        /**
    090         * 可変長の文字列引数を取り、文字列を出力します。
    091         * 文字列の最後に改行が入ります。
    092         *
    093         * @param str String...
    094         */
    095        public void printTag( final String... str ) {
    096                for( int i=0; i<str.length; i++ ) {
    097                        if( rtn2br ) { outFile.print( str[i].replaceAll( CR,BR ) ); }
    098                        else             { outFile.print( str[i] ); }
    099                }
    100                outFile.println();
    101        }
    102
    103        /**
    104         * タグ配列を受け取り、タグ出力します。
    105         *
    106         * 従来は、Tagが、１つの場合と配列の場合で改行出力を分けていましたが、改行しないことにします。
    107         *
    108         * @og.rev 5.5.4.1 (2012/07/06) {&#064;og.value package.class#field} の処理 対応
    109         * @og.rev 5.5.4.1 (2012/07/06) DocletUtil.htmlFilter → StringUtil.htmlFilter に変更
    110         * @og.rev 5.5.4.2 (2012/07/13) タグ出力の最後に改行を入れておきます。
    111         * @og.rev 5.5.5.6 (2012/08/31) @og.tag などに @og.value が含まれている場合の処理を追加
    112         * @og.rev 5.5.5.6 (2012/08/31) @og.tag などに @og.value が含まれている場合の処理を追加
    113         * @og.rev 5.6.3.3 (2013/04/19) @og.tag などに @og.doc03Link が含まれている場合の処理を追加
    114         * @og.rev 5.7.1.1 (2013/12/13) 一旦文字列に入れて、rtn2br の判定処理を行います。
    115         *
    116         * @param tag タグ配列
    117         */
    118        public void printTag( final Tag[] tag ) {
    119                for( int i=0; i<tag.length; i++ ) {
    120                        String tagName = tag[i].name();
    121                        String data = "";
    122                        // {@og.value package.class#field} の処理を行います。
    123                        if( tagName.equalsIgnoreCase( "@og.value" ) ) {
    124//                              outFile.print( DocletUtil.valueTag( tag[i]) );
    125                                data = DocletUtil.valueTag( tag[i] );
    126                        }
    127                        // 5.6.3.3 (2013/04/19) {@og.doc03Link ・・・} の処理を行います。
    128                        else if( tagName.equalsIgnoreCase( "@og.doc03Link" ) ) {
    129//                              outFile.print( DocletUtil.doc03LinkTag( tag[i]) );
    130                                data = DocletUtil.doc03LinkTag( tag[i] );
    131                        }
    132                        // 5.5.5.6 (2012/08/31) @og.tag などに @og.value が含まれている場合の処理を追加
    133                        else if( ! tagName.equalsIgnoreCase( "Text" ) ) {
    134                                printTag( tag[i].inlineTags() );
    135                        }
    136                        else {
    137//                              String data = DocletUtil.htmlFilter( tag[i].text() );
    138//                              String data = StringUtil.htmlFilter( tag[i].text() ).trim();            // 5.5.4.1 (2012/07/06) DocletUtil → StringUtil に変更
    139                                data = StringUtil.htmlFilter( tag[i].text() ).trim();           // 5.5.4.1 (2012/07/06) DocletUtil → StringUtil に変更
    140
    141//                              if( rtn2br ) {
    142//                                      outFile.print( data.replaceAll( CR,BR ) );
    143////                                    outFile.print( BR );
    144//                              }
    145//                              else {
    146////                                    outFile.println( data );
    147//                                      outFile.print( data );
    148//                              }
    149                        }
    150                        if( rtn2br ) {
    151                                outFile.print( data.replaceAll( CR,BR ) );
    152                        }
    153                        else {
    154                                outFile.print( data );
    155                        }
    156                }
    157//              outFile.println();                              // 5.5.4.2 (2012/07/13) タグ出力の最後に改行
    158        }
    159
    160        /**
    161         * 文字列引数を ２つと、タグ配列を受け取り、タグ出力します。
    162         *
    163         * @param str1  第一文字列
    164         * @param tag   タグ配列
    165         * @param str3  第三文字列
    166         */
    167        public void printTag( final String str1,final Tag[] tag, final String str3 ) {
    168                outFile.print( str1 );
    169                printTag( tag );
    170                outFile.println( str3 );
    171        }
    172
    173        /**
    174         * タグ配列を受け取り、タグ出力します。
    175         *
    176         * @param tag Tag[]
    177         */
    178//      public void printTag( final Tag[] tag ) {
    179//              if( tag.length == 1 ) {
    180//                      String data = DocletUtil.htmlFilter( tag[0].text() );
    181//                      if( rtn2br ) { outFile.print( data.replaceAll( CR,BR ) ); }
    182//                      else             { outFile.print( data ); }
    183//              }
    184//              else {
    185//                      for( int i=0; i<tag.length; i++ ) {
    186//                              String data = DocletUtil.htmlFilter( tag[i].text() );
    187//                              if( rtn2br ) {
    188//                                      outFile.print( data.replaceAll( CR,BR ) );
    189//                                      outFile.print( BR );
    190//                              }
    191//                              else {
    192//                                      outFile.println( data );
    193//                              }
    194//                      }
    195//              }
    196//      }
    197
    198        /**
    199         * タグ配列を受け取り、タグ出力します。
    200         * 複数のタグを出力する場合に、カンマ区切り文字で連結します。
    201         *
    202         * @og.rev 5.5.4.1 (2012/07/06) DocletUtil.htmlFilter → StringUtil.htmlFilter に変更
    203         *
    204         * @param tag タグ配列
    205         */
    206        public void printCSVTag( final Tag[] tag ) {
    207                for( int i=0; i<tag.length; i++ ) {
    208//                      String data = DocletUtil.htmlFilter( tag[i].text() );
    209                        String data = StringUtil.htmlFilter( tag[i].text() );           // 5.5.4.1 (2012/07/06) DocletUtil → StringUtil に変更
    210                        if( i > 0 ) { outFile.print( "," ); }
    211                        outFile.print( data );
    212                }
    213        }
    214
    215        /**
    216         * タグ配列を受け取り、タグ出力します。
    217         * ここでは、タグ毎にタグの名称と内容を出力し、改行を行います。
    218         * 特殊処理：ここでは、og.rev タグは取り込みません。
    219         *
    220         * @og.rev 5.5.4.1 (2012/07/06) DocletUtil.htmlFilter → StringUtil.htmlFilter に変更
    221         *
    222         * @param tag タグ配列
    223         */
    224        public void printTagsInfo( final Tag[] tag ) {
    225                for( int i=0; i<tag.length; i++ ) {
    226                        String tagName = tag[i].name();
    227                        if( tagName.equalsIgnoreCase( "@og.rev" ) ) {
    228                                continue;
    229                        }
    230                        outFile.print( tagName );
    231                        outFile.print( " " );
    232//                      outFile.print( DocletUtil.htmlFilter( tag[i].text() ) );
    233                        outFile.print( StringUtil.htmlFilter( tag[i].text() ) );                // 5.5.4.1 (2012/07/06) DocletUtil → StringUtil に変更
    234                        if( rtn2br ) { outFile.print( BR ); }
    235                        else             { outFile.println(); }
    236                }
    237        }
    238
    239        /**
    240         * 文字列引数を ２つと、タグ配列を受け取り、先頭一文字のタグ出力します。
    241         *
    242         * @param str1  第一文字列
    243         * @param tag   タグ配列
    244         * @param str3  第三文字列
    245         */
    246        public void printChar( final String str1,final Tag[] tag, final String str3 ) {
    247                outFile.print( str1 );
    248                if( tag.length > 0 ) {
    249                        String str = tag[0].text();
    250                        if( str != null && str.length() > 0 ) {
    251                                outFile.print( str.charAt(0) );
    252                        }
    253                }
    254                outFile.println( str3 );
    255        }
    256}