OSDN Git Service

わかりやすくはなったけど、ダメダメ。
authortnantoka <bornneet@livedoor.com>
Sun, 30 Aug 2009 14:36:06 +0000 (23:36 +0900)
committertnantoka <bornneet@livedoor.com>
Sun, 30 Aug 2009 14:36:06 +0000 (23:36 +0900)
jquery.tagget.js

index dc12ee0..971f9e8 100644 (file)
                /**
                 * 閉じタグ補完
                 */
-                //TODO: ロジック見直し
+               // カーソル位置より前にある開始タグをさかのぼって見ていく
+               // 閉じタグが何もなければ直近のタグを閉じる
+               // 閉じタグとマッチしないタグがあれば閉じる
+               // カーソル後に閉じタグがあるとかは無視
+               // 整形式じゃないのも無視
                 closeTag: function(t) {
-                
-                                               //                  <<-tag name-><----------attr-------------><->->
-                               var sTag = Cursor.getText(t, /<\s*[^\/!?=]+?(?:\s*[^=>\s]+?\s*=\s*["']?.*?["']?\s*)*\s*>/g);
-                               var sTag2 = Cursor.getText(t, /<\s*[^\/!?=]+?(?:\s*[^=>\s]+?\s*=\s*["']?.*?["']?\s*)*\s*>/g, true);
-                               var eTag = Cursor.getText(t, /<\s*\/\s*.+?\s*>/g);
-                               var eTag2 = Cursor.getText(t, /<\s*\/\s*.+?\s*>/g, true);
-/*
-                               console.log('s:'+sTag);
-                               console.log('s2:'+sTag2);
-                               console.log('e:'+eTag);
-                               console.log('e2:'+eTag2);
-*/
-                               // 整形式じゃなさそうなのはとりあえず無視
-                               if (sTag.length + sTag2.length > eTag.length + eTag2.length) {
+
+                               // カーソルより前の開始タグ一覧
+                               // <! <? </ 空要素/>は除く
+                               // TODO:できれば一文でやりたい
+                               var sTags = Cursor.getText(t, /^[\s\S]*$/)[0]
+                                       .replace(/<[!\?\/][\s\S]*?>/g, '')      // <!?/を除去
+                                       .replace(/<[^\>]*?\/>/g, '')            // 空要素/>を除去
+                                       .match(/<[\s\S]*?>/g);                          // タグ抽出
+                               var eTags = Cursor.getText(t, /<\/[^?]+?>/g);
+                               console.log(sTags);
+                               console.log(eTags);
+                               
+                               if (sTags) {
                                
-                                       for (var i = sTag.length - 1; i >= 0; i--) {
+                                       var i = sTags.length - 1;
+                                               
+                                       for (; i >= 0 && eTags.length > 0; i--) {
                                        
-                                               var s = sTag[i].replace(/^.*<|[\s>].*/g, '');
-                                               if (!eTag || eTag.length == 0 || s != eTag.shift().replace(/^.*\/|>.*/g, '')) {
-                                                       Cursor.insert(t, '</' + s + '>');
-                                                       break;
-                                               }
+                                                       // <までとタグ名以降を除去
+                                                       var sTag = sTags[i].replace(/^.*<|[\s>].*/g, '');
+                                                       var eTag = eTags.shift().replace(/^.*<\/|[\s>].*/g, '');
+
+                                                       console.log(sTag + ':' + eTag);                                         
+                                                       // 閉じタグとマッチしなければその開始タグを閉じる        
+                                                       if (sTag != eTag) {
+                                                               break;
+                                                       }
+                                       
+                                       }
+
+                                       // 全てマッチしたら何もしない
+                                       if (i >= 0) {
+                                               Cursor.insert(t, '</' + sTags[i].replace(/^.*<|[\s>].*/g, '') + '>');
                                        }
 
                                }