添付ファイルの情報



[添付ファイル一覧] [全ページの添付ファイル一覧]

fileCommentOutC.js
格納ファイル名:attach/4D6163726F2FC5EAB9C62F313936_436F6D6D656E744F7574432E6A73
ページ:Macro/投稿/196
格納ファイル名:attach/4D6163726F2FC5EAB9C62F313936_436F6D6D656E744F7574432E6A73
MD5ハッシュ値:d17c31f3cb0d0877dbaad3d7f95bea6b
サイズ:9.3KB (9493 bytes)
Content-type:application/octet-stream
登録日時:2014/05/31 22:47:04
アクセス数:510
MD5ハッシュ値:d17c31f3cb0d0877dbaad3d7f95bea6b
fileCommentOutC.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/*
 [概要]
	行を "/* " と " */" でコメントアウトします。
	
	範囲選択していない場合、カーソルのある行をコメントアウトします。
	範囲選択している場合、選択範囲にある行すべてを1行ずつコメントアウトします。
	(矩形選択でも同じです。)
	範囲選択は、行頭からではなく行の途中から(桁位置>=2)でも構いません。
	
	コメント文字列はデフォルトでC/C++スタイルですが、
	ファイルの拡張子、及び 現在適用されているタイプ別設定 により変わります。
	(対応:sakura:1.6.5.0以降)
 [制限]
	・挙動:
		・行頭がタブ(    )の場合、コメント開始文字列は
		  "/* " ではなく "/*" (スペース無し)になります。
		・次の変数の定義値を変えることで、挙動を変更可能です:
			bCOMMENTHEAD_NotInsertSpaceWhenLineBeginsWithTab
 [変更履歴]
	2014/05/24	case "xxx" 追加:dpr,pas, tex
				タイプ別設定によりコメント文字列を変える。
				選択範囲の最大行数制限を廃止。
				コメント文字列が改行文字を含む場合、1行毎にせず始めと終わりの2箇所だけに挿入。
	2009/04/15	新規
*/
 
// 行頭がタブ(    )の場合、コメント開始文字列を
// "/* " (スペース有り)ではなく "/*" (スペース無し)にするか。
//		true=スペース無しにする / false=スペースを付加する
var bCOMMENTHEAD_NotInsertSpaceWhenLineBeginsWithTab = true;
 
//2014/05/24 選択範囲の最大行数制限を廃止。
//	// メッセージボックスのタイトル。
//	var CAPTION = Editor.ExpandParameter("$M");						// $M=マクロ名(フルパス)。
//	CAPTION = CAPTION.substring( CAPTION.lastIndexOf("\\") + 1 );	// ファイル名部分の取り出し。
//	// メッセージボックスを出すのにWshShell.Popup()を使用する。
//	//	書式(MSDNのWSHより): intButton = WshShell.Popup(strText,[nSecondsToWait],[strTitle],[nType])
//	var WshShell = new ActiveXObject("WScript.shell");
//	// 選択範囲の最大行数。(安全の為、制限する。)
//	var nMAX_LINES = 50;
 
 
 
//--------------
// メイン
Main();
 
function Main()
{
    var sExt;                    // ファイル名の拡張子。(ピリオドを含まない)
    var sTypeExtAry;            // 現在適用されているタイプ別設定の拡張子。(「基本」は除く)
    var sKey, sTypeExt;
    var sCommentHead;            // コメント開始文字列。"/* " (スペース有り)
    var sCommentHead_NoSpace;    // コメント開始文字列。"/*" (スペース無し)
    var sCommentTail;            // コメント終了文字列。" */"
    var sNewline;
    var selstr;                    // 選択文字列。
    var reFrom;                    // 置換前の文字列。(正規表現)
    var reTo;                    // 置換後の文字列。
    
    // エディタがビューモード(読み取り専用)なら終了。
    if( Editor.ExpandParameter("${R?読専$:$:$}") == "読専" ) return;
    
    // ファイル名の拡張子に応じてコメント文字列を変える。
    //		HTMLでもCSS(<style>要素内)でCスタイルのコメントを使いたい場合がありそう。
    //		他にも、ASPXでHTMLスタイルのコメントを使いたい等々…。
    sExt = Editor.ExpandParameter("$f").replace( /^(.*\.|.*)/, "" ).toLowerCase();
    
    //2014/05/24 タイプ別設定によりコメント文字列を変える。
    // 現在適用されているタイプ別設定(タイプ別設定の一時適用)に対応。
    // ファイル名の拡張子より優先させる。(但し「基本」のタイプ別設定は除く。)
    //		例1: .logファイル(「テキスト」「TeX」に登録)で、「TeX」を一時適用。
    //				→ 拡張子を "tex" に。
    //		例2: .logファイルで、「基本」を一時適用。
    //				→ 拡張子は "log" のまま。(「基本」は除く。)
    //		IsSameTypeExt("xxx","<N/A>"):拡張子 "xxx" がタイプ別設定「基本」かを調べる。
    //			タイプ別設定に登録されていない拡張子は「基本」扱いになるので
    //			"xxx" が「基本」(未登録)なら1、「基本」以外なら0が返る(はず)。
    sTypeExtAry = [
        // デフォルト。
        "txt",        "c",        "html",        "sql",        "cbl",
        "java",        "asm",        "awk",        "bat",        "dpr",
        "tex",        "cgi",        "bas",        "rtf",        "ini",
        // ユーザーが追加。(拡張子が未登録(=「基本」)なら無視される。)
        "mac",
        "ppa",
        "js",
    ];
    for( sKey in sTypeExtAry ){
        sTypeExt = sTypeExtAry[ sKey ];
        if( (Editor.IsCurTypeExt( sTypeExt )) && (!Editor.IsSameTypeExt( sTypeExt, "<N/A>" )) ){
            sExt = sTypeExt.toLowerCase();
            break;
        }
    }
    
    // 拡張子毎のコメント開始・終了文字列。(case "xxx" のxxxは必ず小文字で。)
    switch( sExt ){
    case "asp":    
    case "html":    case "htm":    
    case "hta":
    case "php":
    case "shtml":    case "shtm":    case "shm":
    case "wsf":
    case "xhtml":    case "xhtm":    case "xht":
    case "xml":
        // HTMLスタイル。
        sCommentHead = "<!-- ";
        sCommentTail = " -->";
        break;
    
    case "aspx":
    case "jsp":    case "jspf":
    case "psp":
        // JSPスタイル。(サーバサイドのコメント)
        sCommentHead = "<%-- ";
        sCommentTail = " --%>";
        break;
    
    case "dpr":    case "pas":
        // Pascalスタイル。
        //sCommentHead = "(* ";
        //sCommentTail = " *)";
        sCommentHead = "{ ";
        sCommentTail = " }";
        break;
    
    //tex,ltx,sty,bib,log,blg,aux,bbl,toc,lof,lot,idx,ind,glo
    case "tex":
        //sCommentHead = "\\if0" +"\n";
        //sCommentTail = "\\fi"  +"\n";
        // ↓\usepackage{comment} 宣言が必要らしい。
        sCommentHead = "\\begin{comment}" +"\n";
        sCommentTail = "\\end{comment}"   +"\n";
        break;
    
    case "":
    default:
        // Cスタイル。
        sCommentHead = "/* ";
        sCommentTail = " */";
        break;
    }
    
    sNewline = ["\r\n", "\r", "\n"][ Editor.GetLineCode() ];
    if( sNewline == undefined ){
        sNewline = (Editor.GetLineStr( 1 ).match( /(\r\n|\r|\n)/ )) ? RegExp.$1 : "\r\n";
    }
    sCommentHead = sCommentHead.replace( /\r\n|\r|\n/g, sNewline );
    sCommentTail = sCommentTail.replace( /\r\n|\r|\n/g, sNewline );
    
    // "/*" (スペース無し)のコメント開始文字列。
    if( bCOMMENTHEAD_NotInsertSpaceWhenLineBeginsWithTab ){
        sCommentHead_NoSpace = sCommentHead.replace( / /, "" );    // "/*" (スペース無し)
    }else{
        sCommentHead_NoSpace = sCommentHead;        // "/* " (スペース有りのまま)
    }
    
    // カーソル行(非選択時) または 選択範囲の行すべてを範囲選択する。
    if( !SelectLinesOnSelectedRange() ) return;
    if( Editor.IsTextSelected() == 0 ){        // EOFのみの行(ファイルが空も該当)
        Editor.InsText( sCommentHead + sCommentTail );
        return;
    }
    selstr = Editor.GetSelectedString(0);
    if( !(sCommentHead + sCommentTail).match( /[\r\n]/ ) ){
        // コメント文字列が改行文字を含まなければ、通常処理。
        
        // 選択範囲の行頭を "/* " に、行末を " */" に置換する。(Undoは1回。)
        //reFrom = /^([^\r\n]*)(\r\n|\r|\n)/gm;	←改行で終わらないEOF行にマッチしないのでNG
        reFrom = /^([^\r\n]*)(\r\n|\r|\n)?/gm;
        reTo   =
            function($0,$1,$2)
            {
                var head;
                if( $0.length == 0 ) return "";                // EOFの場合
                //if( $0.search( /^(    |\r|\n)/ ) != -1 )	// 行頭がTab or 改行のみ
                if( $0.search( /^\t/ ) != -1 ){                // 行頭がTab
                    head = sCommentHead_NoSpace;
                }else{
                    head = sCommentHead;
                }
                if( typeof $2 == "undefined" ) $2 = "";        // 改行で終わらないEOF行の場合
                return head + $1 + sCommentTail + $2;
            };
        selstr = selstr.replace( reFrom, reTo );
    }else{
        // コメント文字列が改行文字を含む場合、行単位のディレクティブの形式とする。
        // 選択範囲前後に、コメント開始の行・終了の行を新規に挿入。スペース付加無し。
        
        // EOFのある行(ファイルの最終行で、改行で終わらない)なら改行付加。
        if( selstr.match( /[^\r\n]$/ ) ) sCommentTail = sNewline + sCommentTail;
        selstr = sCommentHead + selstr + sCommentTail;
    }
    Editor.InsText( selstr );
    Editor.ReDraw();
}
 
 
//--------------------------------------------------------------
// カーソル行(非選択時) または 選択範囲の行すべてを範囲選択する。
// 選択範囲の開始桁、終了桁は行の途中でも可。(行全体を選択していなくても可。)
// EOFのみの行(行番号が表示されない行)だと何も選択されない(非選択状態)。
//	戻り値:true=成功 / false=メッセージボックスでCancel
function SelectLinesOnSelectedRange()
{
    var nIsTextSelected;
    var row1, row2, col2;
    var y1, y2, x2;
    //2014/05/24 選択範囲の最大行数制限を廃止。
    //	var ans;
    
    nIsTextSelected = Editor.IsTextSelected();
    if( nIsTextSelected == 0 ){
        // カーソルのある行を1行選択。
        Editor.SelectLine(0);
    }else{
        // 選択範囲の開始行(の行頭)から終了行(の行末)までを選択。
        
        row1 = Editor.GetSelectLineFrom();        // 選択開始行(折り返し単位)
        row2 = Editor.GetSelectLineTo();        // 選択終了行(折り返し単位)
        col2 = Editor.GetSelectColmTo();        // 選択終了桁(折り返し単位)
        // 選択状態の取り消し。(範囲選択開始(F6)、矩形範囲選択開始(Shift+F6)の取り消し。)
        Editor.CancelMode();
        // 選択開始行の行頭(改行単位)へ移動。
        Editor.Jump( row1, 0 );                    // 折り返し単位
        Editor.GoLineTop( 1<<3|1<<0 );            // 行頭(改行単位)
        y1 = Editor.ExpandParameter("$y") -0;    // 行位置(改行単位)、文字列→数値
        // 範囲選択開始。
        Editor.BeginSelect();
        // 選択終了行の、次の行の行頭へ移動。
        Editor.Jump( row2, 0 );                    // 折り返し単位
        y2 = Editor.ExpandParameter("$y") -0;    // 行位置(改行単位)、文字列→数値
        x2 = Editor.ExpandParameter("$x") -0;    // 桁位置(改行単位)、文字列→数値
        if( (nIsTextSelected != 2)
            && ((col2 == 1) && (x2 == 1))        // 選択終了位置は行頭(改行単位)だった。
            && (Editor.GetSelectLineTo() >= row2)    // 最終行選択や、選択開始行=終了行だと偽。
        ){
            //y2 = y2;	そのまま。
        }else{
            y2++;    // 選択終了行の行末まで(次の行の行頭まで)を選択。(EOF行なら最後まで。)
        }
        Editor.Jump( y2, 1 );                    // 改行単位
        // 範囲選択終了 しておく。
        Editor.BeginSelect();
        
        //2014/05/24 選択範囲の最大行数制限を廃止。
        //	// 選択範囲の最大行数。(安全の為、制限する。)
        //	if( y2 - y1 > nMAX_LINES ){
        //		ans = WshShell.Popup(
        //			"選択範囲が多すぎます。\n" + 
        //			"安全のため、最大 " + nMAX_LINES + " 行に制限しています。\n\n" +
        //			"続けますか?", 0, CAPTION,
        //			1|48|256 );		// 1=MB_OKCANCEL, 48=MB_ICONEXCLAMATION, 256=MB_DEFBUTTON2
        //		if( ans != 1 ){		// 1=IDOK
        //			//Editor.CancelMode();	とりあえず選択したまま。
        //			return false;
        //		}
        //	}
    }
    return true;
}




    


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS