1 #title = "</⇒"
  2 #tooltip = "終了タグ補完 (入力割り込み)"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * 終了タグを補完します。<br />
  8  * "<"を入力後の"/"をトリガーにした場合に動作するスニペット専用マクロです。<br />
  9  * <p>
 10  * EclipseHTMLEditorを参考にしました。
 11  * </p>
 12  * 
 13  * @author gecca from 雪月花 (http://setsugecca.org/)
 14  * @version 1.00 for EmEditor v10.0
 15  */
 16 
 17 (function() {
 18 	var logger = JseeUtil.getLogger(false, "終了タグ補完 (入力割り込み)");
 19 	
 20 	var tags = JseeUtil.getTopLeftText().match(/<([^\r\n\s>]+).*?>/g);
 21 	if(!tags) {
 22 		//スニペット専用動作 (アラートを表示しない)
 23 		//alert("タグが見つかりませんでした。");
 24 		document.selection.Text = "</"
 25 		return;
 26 	}
 27 	
 28 	logger.log(tags);
 29 	
 30 	var endTag = 0;
 31 	var startTag;
 32 	var exceptTagsMatcher = /<(area|base|bgsound|br|frame|hr|img|input|link|meta|param|!|%)(\s|>$)|\/\s*>$/i;
 33 	for(var i=tags.length-1;i>=0;i--) {
 34 		var tag = tags[i];
 35 		if(logger.available()) logger.log(i + "::" + tag);
 36 		
 37 		if(exceptTagsMatcher.test(tag)) {
 38 			continue;
 39 		} else if(tag.indexOf("</") >= 0) {
 40 			endTag++;
 41 		} else {
 42 			if(endTag > 0) {
 43 				endTag--;
 44 			} else {
 45 				startTag = tag;
 46 				break;
 47 			}
 48 		}
 49 	}
 50 	
 51 	if(startTag) {
 52 		var endTag = startTag.replace(/^<([^\r\n\s>]+).*>$/, "</$1>");
 53 		document.selection.Text = endTag;
 54 		// スニペット専用動作。スラッシュをトリガーにした場合の専用動作を行います。
 55 		// 補完が期待しないものだった場合に消しやすいよう、挿入した文字列を選択状態にします。
 56 		document.selection.CharLeft(true,endTag.length - 2);
 57 	} else {
 58 		// スニペット専用動作
 59 		//alert("対応する開始タグが見つかりませんでした。");
 60 		document.selection.Text = "</"
 61 	}
 62 })();
 63