1 #title = "駱"
  2 #tooltip = "選択文字列をキャメライズ"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * クリップボードの文字列に対して、「アッパーキャメルケース」・「ロウワーキャメルケース」・「アンダースコア区切り」を相互変換します。<br />
  8  * マクロ実行の度に右記のように変化します:"FOO_BAR"⇒"FooBar"⇒"fooBar"⇒"FOO_BAR"⇒・・・<br />
  9  * 複数行にまたがる変換も可能です。変換できない行は無視します。
 10  * <p>
 11  * 「クリップボードをキャメライズ.jsee」の選択文字列対応版です。
 12  * </p>
 13  * <p>
 14  * Seasar2のStringUtil#camelizeに影響を受けました。<br>
 15  * ショートカットキー(Ctrl+Alt+K)はeclipseに合わせました。
 16  * </p>
 17  * 
 18  * @author gecca from 雪月花 (http://setsugecca.org/)
 19  * @version 1.01 for EmEditor v10.0
 20  */
 21 
 22 (function() {
 23 	var target = document.selection.Text;
 24 	var topX = document.selection.GetTopPointX(eePosLogical);
 25 	var topY = document.selection.GetTopPointY(eePosLogical);
 26 	
 27 	// チェック処理 (「クリップボードをキャメライズ.jsee」と共通)
 28 	if(!target) {
 29 		return;
 30 	}
 31 	if(target.length >= 1000) {
 32 		if(!confirm("変換対象の文字数が1000を越えています。処理を続けてよろしいですか?")) {
 33 			return;
 34 		}
 35 	}
 36 	
 37 	document.selection.Text = translateStringAsLines(target);
 38 	
 39 	// 選択状態を復帰 (選択開始部分は同じで、選択終了部分はText代入後のキャレット位置)
 40 	var bottomX = document.selection.GetBottomPointX(eePosLogical);
 41 	var bottomY = document.selection.GetBottomPointY(eePosLogical);
 42 	document.selection.SetActivePoint(eePosLogical, topX, topY);
 43 	document.selection.SetActivePoint(eePosLogical, bottomX, bottomY, true);
 44 	
 45 	return;
 46 	
 47 	// 変換処理 (「クリップボードをキャメライズ.jsee」と共通)
 48 	function translateStringAsLines(target) {
 49 		var lines = JseeUtil.str2lines(target, true);
 50 		
 51 		var result = "";
 52 		for(var i=0;i<lines.length;i++) {
 53 			result += translate(lines[i]);
 54 		}
 55 		return result;
 56 		
 57 		function translate(target) {
 58 			if(!target.match(/^[a-zA-Z]\w*(\r\n|\r|\n|$)/g)) {
 59 				return target;
 60 			}
 61 			
 62 			if(doneUnderScore(target)) {
 63 				return JseeUtil.upperCamelize(target);
 64 			}
 65 			if(doneLowerCamelize(target)) {
 66 				return JseeUtil.underScorize(target);
 67 			}
 68 			if(doneUpperCamelize(target)) {
 69 				return target.charAt(0).toLowerCase() + target.substring(1);
 70 			}
 71 			
 72 			return target;
 73 			
 74 			function doneUpperCamelize(target) {
 75 				return !target.match("_") && target.charAt(0) <= 'Z' || target.match(/^[A-Z][^_]*(\r\n|\r|\n|$)/);
 76 			}
 77 			
 78 			function doneLowerCamelize(target) {
 79 				return !target.match("_") && target.charAt(0) >= 'a';
 80 			}
 81 			
 82 			function doneUnderScore(target) {
 83 				return target.match(/^[^a-z]+$/);
 84 			}
 85 		}
 86 	}
 87 })();
 88