'>' : 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
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
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
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
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
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
}; \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
};\r
} else {\r
// area[href],a[href]\r
- }\r
+ };\r
};\r
\r
if( filter && xnodes.length ){\r