1 #title = "@Bean"
  2 #tooltip = "JavaBean自動生成"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * ポップアップメニューの選択により、JavaBeanのソースコードを自動生成したり、設定ファイルを開いたりします。<br />
  8  * 設定ファイル「JavaBean自動生成_設定.java」が必要です。
  9  * 
 10  * <p>
 11  * 設計書などを元に、後で修正したりコメントを追加する必要のない、完全な形のソースコードを生成することを目的としています。<br />
 12  * 自動生成時、新しく開いたタブにJavaBeanのソースコードを出力します。
 13  * </p>
 14  * <p>
 15  * このマクロは、JavaBeanの使用や、ソースコードの自動生成を推奨するものではありません。
 16  * </p>
 17  * 
 18  * @author gecca from 雪月花 (http://setsugecca.org/)
 19  * @version 1.02 for EmEditor v10.0
 20  */
 21 
 22 (function() {
 23 	var configFilePath = JseeUtil.getScriptPath() + "JavaBean自動生成_設定.java";
 24 	
 25 	JseeUtil.createPopupMenu([
 26 		["生成 (&G)", createBean],
 27 		["設定ファイルを編集 (&E)", function() { JseeUtil.openFile(configFilePath); }],
 28 	]);
 29 	
 30 	function createBean() {
 31 		// 読み込み
 32 		var lines = JseeUtil.str2lines(JseeUtil.readFile(configFilePath));
 33 		
 34 		var header;
 35 		var footer;
 36 		var type_varName_description;
 37 		var fieldTemplate;
 38 		var methodTemplate;
 39 		for(var i=0;i<lines.length;i++) {
 40 			if(lines[i] == "[header]") {
 41 				header = "";
 42 			} else if(lines[i] == "[footer]") {
 43 				footer = "";
 44 			} else if(lines[i] == "[type_varName_description]") {
 45 				type_varName_description = "";
 46 			} else if(lines[i] == "[fieldTemplate]") {
 47 				fieldTemplate = "";
 48 			} else if(lines[i] == "[methodTemplate]") {
 49 				methodTemplate = "";
 50 			} else {
 51 				// セクションでなければ、現在有効な変数に文字列追加
 52 				if(!JseeUtil.isUndef(methodTemplate)) {
 53 					methodTemplate += lines[i] + "\n";
 54 				} else if(!JseeUtil.isUndef(fieldTemplate)) {
 55 					fieldTemplate += lines[i] + "\n";
 56 				} else if(!JseeUtil.isUndef(type_varName_description)) {
 57 					type_varName_description += lines[i] + "\n";
 58 				} else if(!JseeUtil.isUndef(footer)) {
 59 					footer += lines[i] + "\n";
 60 				} else if(!JseeUtil.isUndef(header)) {
 61 					header += lines[i] + "\n";
 62 				}
 63 			}
 64 		}
 65 		
 66 		// バリデーション
 67 		var error = function(str) {
 68 			alert(str + "\n設定ファイルを開きます。");
 69 			JseeUtil.openFile(configFilePath);
 70 			JseeUtil.findAll(new RegExp("^" + str.replace(/.*?\[(.*?)\].*/g, "\\[$1\\]")));
 71 			quit();
 72 		};
 73 		if(JseeUtil.isUndef(header)) {
 74 			error("[header]セクションが宣言されていません。");
 75 		}
 76 		if(JseeUtil.isUndef(footer)) {
 77 			error("[footer]セクションが宣言されていません。");
 78 		}
 79 		if(JseeUtil.isUndef(type_varName_description)) {
 80 			error("[type_varName_description]セクションが宣言されていません。");
 81 		}
 82 		if(!/\S/.test(type_varName_description)) {
 83 			error("[type_varName_description]セクション内の記述が空です。");
 84 		}
 85 		if(JseeUtil.isUndef(fieldTemplate)) {
 86 			error("[fieldTemplate]セクションが宣言されていません。");
 87 		}
 88 		if(!/\S/.test(fieldTemplate)) {
 89 			error("[fieldTemplate]セクション内の記述が空です。");
 90 		}
 91 		if(JseeUtil.isUndef(methodTemplate)) {
 92 			error("[methodTemplate]セクションが宣言されていません。");
 93 		}
 94 		if(!/\S/.test(methodTemplate)) {
 95 			error("[methodTemplate]セクション内の記述が空です。");
 96 		}
 97 		
 98 		// セクションの先頭と末尾の改行を削る
 99 		header = header.replace(/^(\r\n|\r|\n)/, "").replace(/(\r\n|\r|\n)$/, "");
100 		footer = footer.replace(/^(\r\n|\r|\n)/, "").replace(/(\r\n|\r|\n)$/, "");
101 		type_varName_description = type_varName_description.replace(/^(\r\n|\r|\n)/, "").replace(/(\r\n|\r|\n)$/, "");
102 		fieldTemplate = fieldTemplate.replace(/^(\r\n|\r|\n)/, "").replace(/(\r\n|\r|\n)$/, "");
103 		methodTemplate = methodTemplate.replace(/^(\r\n|\r|\n)/, "").replace(/(\r\n|\r|\n)$/, "");
104 		
105 		// 読み込み結果をEntityにマッピング
106 		function Entity(type, varName, description) {
107 			this.type = type;
108 			this.varName = varName;
109 			this.description = description;
110 		}
111 		var entities = [];
112 		var type_varName_descriptionLines = type_varName_description.split(/[\r\n]+/);
113 		for(var i=0;i<type_varName_descriptionLines.length;i++) {
114 			if(type_varName_descriptionLines[i]) {
115 				var splitted = type_varName_descriptionLines[i].split("\t");
116 				if(splitted.length == 3) {
117 					entities.push(new Entity(splitted[0], splitted[1], splitted[2]));
118 				} else {
119 					alert("[type_varName_description]内の" + (i + 1) + "行目のTSV形式が異常です。\n");
120 					quit();
121 				}
122 			}
123 		}
124 		if(entities.length == 0) {
125 			
126 		}
127 		
128 		// 出力結果
129 		var results = [];
130 		
131 		// ヘッダ
132 		if(header) {
133 			results.push(header);
134 		}
135 		// フィールド
136 		for(var i=0;i<entities.length;i++) {
137 			results.push(fieldTemplate.replace(/varName/g, entities[i].varName).replace(/type/g, entities[i].type).replace(/description/g, entities[i].description));
138 		}
139 		// メソッド
140 		for(var i=0;i<entities.length;i++) {
141 			results.push(methodTemplate.replace(/varName/g, entities[i].varName).replace(/type/g, entities[i].type).replace(/description/g, entities[i].description).replace(/VarName/g, entities[i].varName.charAt(0).toUpperCase() + entities[i].varName.substring(1)));
142 		}
143 		// フッタ
144 		if(footer) {
145 			results.push(footer);
146 		}
147 		
148 		// 結果を出力
149 		JseeUtil.newTab();
150 		document.selection.Text = results.join("\n\n") + "\n";
151 		try {
152 			document.ConfigName = "Java";
153 		} catch(e) {}
154 	}
155 })();
156