1 #title = "行列c"
  2 #tooltip = "クリップボードの行と列を入れ替える"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * ダイアログに指定した区切り文字を元に、クリップボードに格納された表の行と列を入れ替えます。<br />
  8  * (変換後の改行コードは、クリップボード内の最初の改行コードに統一されます。)
  9  * 
 10  * <pre>
 11  * // クリップボードの内容
 12  * a,b,c
 13  * 1,2
 14  * 
 15  * // マクロを実行し、入力ダイアログに","を入力した結果
 16  * a,1
 17  * b,2
 18  * c
 19  * </pre>
 20  * 
 21  * @author gecca from 雪月花 (http://setsugecca.org/)
 22  * @version 1.00 for EmEditor v10.0
 23  */
 24 
 25 (function() {
 26 	// 区切り文字候補 (先に定義されたものほど優先)
 27 	var delimiterCandidates = ["\t", ","];
 28 	
 29 	var target = clipboardData.getData("Text");
 30 	
 31 	// 改行コードを判定
 32 	var breakCode = (function() {
 33 		if(target.match(/(\r\n|\r|\n)/)) {
 34 			return RegExp.$1;
 35 		} else {
 36 			return "\r\n";
 37 		}
 38 	})();
 39 	
 40 	// 区切り文字を決定
 41 	var delimiter = (function() {
 42 		// 区切り文字候補を、変換対象文字列から探す
 43 		var foundCandidate;
 44 		for(var i=0;i<delimiterCandidates.length;i++) {
 45 			var candidate = delimiterCandidates[i];
 46 			if(target.indexOf(candidate) >= 0) {
 47 				foundCandidate = delimiterCandidates[i].replace(/\t/g, "\\t");
 48 				break;
 49 			}
 50 		}
 51 		
 52 		var input = prompt("区切り文字", foundCandidate ? foundCandidate : "");
 53 		if(!input) return;
 54 		
 55 		if(input.match(/\\r|\\n/)) {
 56 			alert("改行を指定することは出来ません。");
 57 			return;
 58 		}
 59 		
 60 		return input.replace(/\\t/g, "\t");
 61 	})();
 62 	if(!delimiter) return;
 63 	
 64 	// 要素ごとに分解して配列化
 65 	var allItems = (function() {
 66 		var allItems = [];
 67 		var lines = target.split(/\r|\n|\r\n/);
 68 		
 69 		for(var i=0;i<lines.length;i++) {
 70 			var lineItems = lines[i].split(delimiter);
 71 			for(var j=0;j<lineItems.length;j++) {
 72 				if(!allItems[j]) {
 73 					allItems[j] = [];
 74 				}
 75 				allItems[j][i] = lineItems[j];
 76 			}
 77 		}
 78 		
 79 		return allItems;
 80 	})();
 81 	
 82 	// 要素の配列を組み直す
 83 	var result = (function() {
 84 		var buf = "";
 85 		
 86 		for(var i=0;i<allItems.length;i++) {
 87 			for(var j=0;j<allItems[i].length;j++) {
 88 				if(allItems[i][j] != undefined) {
 89 					buf += allItems[i][j];
 90 					if(j + 1 < allItems[i].length) {
 91 						buf += delimiter;
 92 					}
 93 				}
 94 			}
 95 			buf = buf/*.replace(lastDelims, "")*/;
 96 			if(i+1 < allItems.length) {
 97 				buf += breakCode;
 98 			}
 99 		}
100 		
101 		return buf;
102 	})();
103 	
104 	if(result) {
105 		alert("行と列を入れ替えました");
106 		ClipboardData.setData("Text", result);
107 	}
108 })();
109