OSDN Git Service

Version 0.6.84, fix for :contains() & :lang().
authoritozyun <itozyun@user.sourceforge.jp>
Mon, 22 Sep 2014 13:59:08 +0000 (22:59 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Mon, 22 Sep 2014 13:59:08 +0000 (22:59 +0900)
0.6.x/js/01_dom/18_XDomQuery.js
0.6.x/js/04_net/02_XNetJSONP.js

index e1740fd..c09136d 100644 (file)
@@ -37,7 +37,8 @@ X.Dom.Query = {
                '>'   : 2, // 子セレクタ\r
                '+'   : 3, // 兄弟セレクタ,共通の親を持つ、1番目要素が2番目要素の1つ前にある\r
                '~'   : 4, // 一般兄弟セレクタ,共通の親を持つ、1番目要素が2番目要素の前 (直前でなくともよい) にある\r
-               ','   : 5\r
+               ','   : 5,\r
+               '@'   : 6  // XML 用の拡張、属性ノードを辿る http://www.marguerite.jp/Nihongo/WWW/RefDOM/_Attr_interface.html\r
        },\r
        _SELECTOR : {\r
                ''    : 0, // none\r
@@ -51,16 +52,17 @@ X.Dom.Query = {
                root  : 8,\r
                link  : 9\r
        },\r
-       _OPERATORS : { '==' : 1, '!=': 2, '~=': 3, '^=': 4, '$=': 5, '*=': 6, '|=': 7 },\r
+       _OPERATORS : { '==' : 1, '!=': 2, '~=': 3, '^=': 4, '$=': 5, '*=': 6, '|=': 7 }, // '':0 は属性が存在するならtrue\r
+       // TODO { a : 1, A : 2, _ : 3,,, }\r
        _ALPHABET  : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789\\',\r
        _NUMBER    : '+-0123456789'\r
 };\r
                        \r
 /*\r
- * セレクタ文字の解析\r
+ * セレクタ文字列の解析、但し一挙に行わず、ひと塊づつ\r
  * 結合子 + 単体セレクタ( タグ,*,#,.,[],: )\r
  * ' ' 子孫セレクタ, '>' 直下,'+','~' の場合、tagName|* を返す\r
- * return [ pointer, [ selector, ... ] ] error: return pointer\r
+ * return [ 今回のパースで解析した終端位置, [ selector, ... ] ] error: return pointer\r
  */\r
 X.Dom.Query._parse = function( query, last ){\r
        var COMBINATOR = X.Dom.Query._COMBINATOR,\r
@@ -105,7 +107,7 @@ X.Dom.Query._parse = function( query, last ){
                                break;\r
                        case 0x2 :\r
                                !nameChr && !( escape && ( selector === 2 || selector === 3 ) && ( chr === ':' || chr === '.' ) ) ? // id or class の場合 : . を直前にエスケープした場合に限り使える\r
-                                       ( name = query.substring( start, i ) ) && ( phase = selector === 4 && name !== 'not' && chr === '(' ? 0x8 : 0xe ) :\r
+                                       ( name = query.substring( start, i ) ) && ( phase = selector === 4 && name !== 'not' && chr === '(' ? ( name !== 'lang' && name !== 'contains' ? 0x8 : 0xb ) : 0xe ) :\r
                                SELECTOR[ chr ] < 4 && ( phase = 0xe );\r
                                break;\r
                        \r
@@ -154,18 +156,29 @@ X.Dom.Query._parse = function( query, last ){
                                query.substr( i, 3 ) === 'odd' ?\r
                                        ( ( a = 2 ) && ( b = 1 ) && ( i += 2 ) ) :                                      \r
                                chr === ')' && ( phase = a ? 0xe : 0xf ) && ++i;\r
-                               //console.log( '0x8: ' + name1st + ' ' + chrCode + ' ' + chr + ' ' + phase );\r
+                               //console.log( '0x8: ' + name1st + ' ' + chrCode + ' ' + chr + ' ' + phase + ' ' + name );\r
                                break;\r
                        case 0x9 :\r
                                tmp = query.substring( start, i );\r
                                chr === 'n' ?\r
                                        ( phase = 0xa ) && ( start = i + 1 ) && ( a = tmp === '+' ? 1 : tmp === '-' ? -1 : parseFloat( tmp ) ) :\r
-                               chr === ')' && ( phase = 0xe ) && ( b = parseFloat( tmp ) ) && ++i && ( a = 0 );\r
+                               chr === ')' && ( phase = 0xe ) && ++i && ( b = parseFloat( tmp ) ) && ( a = 0 );\r
                                //console.log( '0x9: ' + name1st + ' ' + chrCode + ' ' + chr + ' ' + phase );\r
                                break;\r
                        case 0xa :\r
                                chr === ')' && ( phase = 0xe ) && ++i && ( b = parseFloat( query.substring( start, i ) ) || 0 );\r
-                               //console.log( '0xa: ' + start + ' ' + i );\r
+                               console.log( '0xa: ' + start + ' ' + i );\r
+                               break;\r
+                       // contains, lang\r
+                       case 0xb :\r
+                               ( chr === '"' || chr === "'" ) && !escape && !quot &&\r
+                                       ( quot = chr ) && ( start = i + 1 ) && ( phase = 0xc );\r
+                               break;  \r
+                       case 0xc :\r
+                               chr === quot && !escape && ( value = query.substring( start, i ) ) && ( phase = 0xd );\r
+                               break;\r
+                       case 0xd :\r
+                               chr === ')' && ( phase = 0xe ) && ++i;                          \r
                                break;\r
                        default :\r
                };\r
@@ -179,13 +192,15 @@ X.Dom.Query._parse = function( query, last ){
                                        phase    = 0x0;\r
                                        name     = null;\r
                                        continue;\r
+                               } else\r
+                               if( name === 'lang' || name === 'contains' ){\r
+                                       result = [ not ? 0 : combinator, selector, name, value ];\r
+                                       break;\r
                                } else {\r
                                        if( a !== a || b !== b ) return i;\r
                                        result = [ not ? 0 : combinator, selector, name, a, b ];\r
                                        break;  \r
                                };\r
-                               // lang result = [ not ? 0 : combinator, selector, name, lan ];\r
-                               // contains result = [ not ? 0 : combinator, selector, name, text ];\r
                        };\r
                        result =\r
                                combinator === 5 ?\r
@@ -209,6 +224,7 @@ X.Dom.Query._parse = function( query, last ){
                var HTML      = Node._html,\r
                        scope     = this.constructor === X.Dom.NodeList && this.length ? this : [ this.constructor === Node ? this : Node._body ],\r
                        parents   = scope, // 探索元の親要素 XNodeList の場合あり\r
+                       // TODO { title : true,,, }\r
                        noLower   = 'title id name class for action archive background cite classid codebase data href longdesc profile src usemap',// + X.Dom.DTD.ATTR_VAL_IS_URI.join( ' ' ),\r
                        ARY_PUSH  = Array.prototype.push,\r
                        ret       = [], // 結果要素\r
@@ -328,7 +344,9 @@ X.Dom.Query._parse = function( query, last ){
                                                };                                                              \r
                                        };\r
                                        break;\r
-                                       \r
+                               \r
+                               // case 6 : 属性ノードは実装しない\r
+                               \r
                                default :\r
                                        if( combinator === 1 || ( isStart && selector < 7 ) ){\r
                                                //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
@@ -380,7 +398,7 @@ X.Dom.Query._parse = function( query, last ){
                                                };\r
                                        } else {\r
                                                // area[href],a[href]\r
-                                       }\r
+                                       };\r
                        };\r
                        \r
                        if( filter && xnodes.length ){\r
index 75d5323..f8df0bd 100644 (file)
@@ -8,6 +8,8 @@
 
 /*
  * IE6(IETester) で動かない,localhost
+ * 
+ * TODO postMessage
  */
 
 X.Net.JSONP = {