C# のスリー・スラッシュ・コメントのドキュメント化

Cs-To-Doc コマンドレット

# ■概要 #  C# のスリー・スラッシュ・コメントをドキュメント化。 # #  ドキュメントはタブ区切り文字列です。 # # ■使い方 #  C# のソースコードをクリップボードにコピーして本コマンドレッドを実行。 #  実行結果はクリップボードに出力(コピー)。 # #  public のメソッドとフィールドがドキュメント化の対象です。 # ※ メソッドとフィールドは区別していないため、フィールドに対しても #  引数と戻り値の欄を設けます。 # ※ メソッドが複数行で記述している場合には対応していません。 # # ■例 # #  入力) # # /// <summary> # /// 初期化 # /// </summary> # /// <param name="strAppName">アプリ名</param> # /// <param name="nScreenW">画面の横サイズ</param> # /// <param name="nScreenH">画面の縦サイズ</param> # /// <returns>実行結果。 # /// 正常時は true 、失敗時は false を返す。 # /// </returns> # public bool Init( string strAppName, int nScreenW, int nScreenH ) # { # // ... 処理内容省略 ... # # // 初期化成功 # return true; # } # # /// <summary> # /// クリア # /// </summary> # public void Clear() # { # // ... 処理内容省略 ... # } # #  出力)`t = タブ文字、`n = 改行 # # 概要`t"初期化"`n # public bool Init( string strAppName, int nScreenW, int nScreenH )`n # 引数`tstrAppName`t"アプリ名"`n # `tnScreenW`t"画面の横サイズ"`n # `tnScreenH`t"画面の縦サイズ"`n # 戻り値`t"実行結果。`n正常時は true 、失敗時は false を返す。"`n # 概要`t"クリア"`n # public void Clear() # 引数`tなし`n # 戻り値`tなし`n # # trap { break } Function Output-Doc { Param( $wk ) # 各文字列を改行区切りで結合 $str = $wk.lines -join "`n" # タグ直後の改行を除く $str = $str -replace '>\n+', '>' # タグ直前の改行を除く $str = $str -replace '\n+<', '<' #### XML へ変換 $xml = [xml] ('<xml>' + $str + '</xml>') #### 概要 "概要`t`"{0}`"" -f $xml.GetElementsByTagName('summary').InnerText #### メソッド $wk.method #### 引数 $params = $xml.GetElementsByTagName('param') if( $params.Count -eq 0 ) { "引数`t{0}" -f 'なし' } else { $title = '引数' $em = $params.GetEnumerator() while( $em.MoveNext() ) { "{0}`t{1}`t`"{2}`"" -f $title ,$em.Current.GetAttribute('name') ,$em.Current.InnerText $title = '' } } #### 戻り値 $returns = $xml.GetElementsByTagName('returns') if( $returns.Count -eq 0 ) { "戻り値`t{0}" -f 'なし' } else { "戻り値`t`"{0}`"" -f $returns.InnerText } } Function Parse-Comment { Param( $lines ) Begin { $X_PROCESS_START = 0 $X_PROCESS_COMMENT = 1 $nProcessId = $X_PROCESS_START $rgComment = [System.Text.RegularExpressions.Regex]::new( '^[\t ]*///[\t ]*(.*)$' ); $rgEndComment = [System.Text.RegularExpressions.Regex]::new( '^[\t ]*public[\t ]+(.*)$' ); $wk = @{ lineIndex = 0; lineCounter = 0; beginIndex = -1; endIndex = -1; lines = New-Object 'System.Collections.ArrayList' method = '' } $wk.Clear = { $wk.lines.Clear() $wk.method = '' }.GetNewClosure() } Process { $wk.lineIndex = $wk.lineCounter ++ $line = $_ $bLoop = $False do { switch( $nProcessId ) { $X_PROCESS_START { $m = $rgComment.Match( $line ) if( $m.Success ) { $wk.beginIndex = $wk.lineIndex [void] $wk.lines.Add( $m.Groups[1].Value ) $nProcessId = $X_PROCESS_COMMENT } } $X_PROCESS_COMMENT { $m = $rgEndComment.Match( $line ) if( $m.Success ) { $wk.endIndex = $wk.lineIndex $wk.method = $m.Groups[1].Value Output-Doc $wk & $wk.Clear $nProcessId = $X_PROCESS_START break } $m = $rgComment.Match( $line ) if( $m.Success ) { [void] $wk.lines.Add( $m.Groups[1].Value ) break } & $wk.Clear $nProcessId = $X_PROCESS_START } } }while( $bLoop ) } } $lines = Get-Clipboard $lines | Parse-Comment $lines | Set-Clipboard