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