1 #title = "br"
  2 #tooltip = "コメント内改行+文字列内改行+下に行挿入"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * コメント内では、コメントの記号(「 * 」や「// 」など)を補完しながら改行します。<br />
  8  * 文字列内では、文字列と結合記号(「"」や「'」と「+」や「||」)を補完しながら改行します。<br />
  9  * 補完対象ではない場合は、規定の[下に行挿入]を行います。
 10  * <p>
 11  * Eclipseを参考にしました。
 12  * </p>
 13  * 
 14  * @author gecca from 雪月花 (http://setsugecca.org/)
 15  * @version 1.00 for EmEditor v10.0
 16  */
 17 
 18 (function() {
 19 	var LineComment1 = document.Config.Highlight.LineComment1;
 20 	var LineComment2 = document.Config.Highlight.LineComment2;
 21 	var CommentBegin = document.Config.Highlight.CommentBegin;
 22 	
 23 	var activeX = document.selection.GetActivePointX(eePosLogical);
 24 	var activeY = document.selection.GetActivePointY(eePosLogical);
 25 	
 26 	// キャレット位置の行を取得
 27 	var line = document.getLine(activeY).substring(0, activeX - 1);
 28 	
 29 	// キャレット位置の改行を取得
 30 	var br = JseeUtil.getBr();
 31 	
 32 	// ■コメント内改行系
 33 	
 34 	// 「 * 」⇒「 * \n * 」 (固定文字列)
 35 	if(/^(\s* \* \s*)/.test(line)) {
 36 		document.selection.Text = br + RegExp.$1;
 37 	
 38 	// 「// 」⇒「// \n// 」
 39 	} else if(LineComment1 && new RegExp("^(\\s*" + JseeUtil.quote(LineComment1) + "+\\s*)").test(line)) {
 40 		document.selection.Text = br + RegExp.$1;
 41 	
 42 	// 「// 」⇒「// \n// 」
 43 	} else if(LineComment2 && new RegExp("^(\\s*" + JseeUtil.quote(LineComment2) + "+\\s*)").test(line)) {
 44 		document.selection.Text = br + RegExp.$1;
 45 	
 46 	// 「/*」⇒「/*\n * 」
 47 	} else if(CommentBegin && CommentBegin.length > 1 && new RegExp("^(\\s*)" + JseeUtil.quote(CommentBegin)).test(line)) {
 48 		document.selection.Text = br + RegExp.$1 + " " + CommentBegin.substring(1) + " ";
 49 	
 50 	// 「/*」⇒「/*\n * 」 (固定文字列)
 51 	} else if(/^(\s*)\/\*/.test(line)) {
 52 		document.selection.Text = br + RegExp.$1 + " * ";
 53 	
 54 	// それ以外
 55 	} else {
 56 		// ■文字列内改行系
 57 		
 58 		// キャレットの左側の文字列
 59 		var leftFromCaret = document.GetLine(document.selection.GetActivePointY(eePosLogical)).substring(0, document.selection.GetActivePointX(eePosLogical) - 1);
 60 		
 61 		// 文字列結合記号
 62 		var concater = JseeUtil.getConcater();
 63 		
 64 		// ダブルクォーテーション内の改行
 65 		if(leftFromCaret.split("\"").length % 2 == 0) {
 66 			// 自動インデント
 67 			var indent = /^\s*/.exec(leftFromCaret)[0];
 68 			// 「+ "」にマッチしなければ、追加インデント
 69 			if(!new RegExp("^\\s*" + JseeUtil.quote(concater) + "\\s*\"").test(leftFromCaret)) {
 70 				indent += JseeUtil.getIndent();
 71 			}
 72 			document.selection.Text = "\"" + br + indent + concater + " \"";
 73 		
 74 		// シングルクォーテーション内の改行
 75 		} else if(leftFromCaret.split("'").length % 2 == 0) {
 76 			// 自動インデント
 77 			var indent = /^\s*/.exec(leftFromCaret)[0];
 78 			// 「+ '」にマッチしなければ、追加インデント
 79 			if(!new RegExp("^\\s*" + JseeUtil.quote(concater) + "\\s*\'").test(leftFromCaret)) {
 80 				indent += JseeUtil.getIndent();
 81 			}
 82 			document.selection.Text = "\"" + br + indent + concater + " \'";
 83 			
 84 		// どの状況にも当てはまらなければ、既存の「下に行挿入」を呼び出す
 85 		} else {
 86 			// ■下に行挿入
 87 			document.selection.LineOpen(false);
 88 		}
 89 	}
 90 })();
 91