Comparing version 1.3.8 to 1.3.9
{ | ||
"name": "nwmatcher", | ||
"version": "1.3.8", | ||
"version": "1.3.9", | ||
"description": "A CSS3-compliant JavaScript selector engine.", | ||
@@ -5,0 +5,0 @@ "homepage": "http://javascript.nwbox.com/NWMatcher/", |
@@ -24,7 +24,7 @@ /* | ||
// create or extend NW namespace | ||
((global.NW || (global.NW = global.Object())) && | ||
(global.NW.Dom || (global.NW.Dom = global.Object()))), | ||
((global.NW || (global.NW = { })) && | ||
(global.NW.Dom || (global.NW.Dom = { })), | ||
Contexts = global.Object(), | ||
Results = global.Object(), | ||
Contexts = { }, | ||
Results = { }, | ||
@@ -38,2 +38,5 @@ isEnabled = false, | ||
// timing pauses | ||
now = 0, | ||
// last time cache initialization was called | ||
@@ -76,6 +79,6 @@ lastCalled = 0, | ||
// hammered by dom mutations (jdalton) | ||
now = (new global.Date).getTime(); | ||
now = (new Date).getTime(); | ||
if ((now - lastCalled) < minCacheRest) { | ||
isPaused = isExpired = true; | ||
global.setTimeout(function() { isPaused = false; }, minCacheRest); | ||
setTimeout(function() { isPaused = false; }, minCacheRest); | ||
} else setCache(true, doc); | ||
@@ -150,4 +153,4 @@ lastCalled = now; | ||
isExpired = true; | ||
Contexts = global.Object(); | ||
Results = global.Object(); | ||
Contexts = { }; | ||
Results = { }; | ||
}; | ||
@@ -154,0 +157,0 @@ |
@@ -63,6 +63,6 @@ /* | ||
// compiler will add this to "source" | ||
return global.Object({ | ||
return { | ||
'source': source, | ||
'status': status | ||
}); | ||
}; | ||
@@ -120,6 +120,6 @@ }; | ||
// compiler will add this to "source" | ||
return global.Object({ | ||
return { | ||
'source': source, | ||
'status': status | ||
}); | ||
}; | ||
@@ -126,0 +126,0 @@ }; |
@@ -26,7 +26,7 @@ /* | ||
var LINK_NODES = global.Object({ | ||
var LINK_NODES = { | ||
'a': 1, 'A': 1, | ||
'area': 1, 'AREA': 1, | ||
'link': 1, 'LINK': 1 | ||
}), | ||
}, | ||
@@ -126,4 +126,4 @@ root = document.documentElement, | ||
} else { | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? global.parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? global.parseInt(n[1], 10) : 0); | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); | ||
if (n && n[1] == '-') a = -1; | ||
@@ -162,6 +162,6 @@ } | ||
return global.Object({ | ||
return { | ||
'source': source, | ||
'status': status | ||
}); | ||
}; | ||
@@ -181,5 +181,5 @@ }; | ||
reTrimSpace = global.RegExp('^\\s+|\\s+$', 'g'), | ||
reTrimSpace = RegExp('^\\s+|\\s+$', 'g'), | ||
reSimpleNot = global.RegExp('^((?!:not)' + | ||
reSimpleNot = RegExp('^((?!:not)' + | ||
'(' + Tokens.prefixes + '|' + Tokens.identifier + | ||
@@ -270,6 +270,6 @@ '|\\([^()]*\\))+|\\[' + Tokens.attributes + '\\])$'); | ||
return global.Object({ | ||
return { | ||
'source': source, | ||
'status': status | ||
}); | ||
}; | ||
@@ -276,0 +276,0 @@ }; |
@@ -27,6 +27,6 @@ /* | ||
HTML5PseudoClasses = global.Object({ | ||
HTML5PseudoClasses = { | ||
'default': 4, 'indeterminate': 4, 'invalid': 4, 'valid': 4, | ||
'optional': 4, 'required': 4, 'read-write': 4, 'read-only': 4 | ||
}); | ||
}; | ||
@@ -98,6 +98,6 @@ switch (match[1]) { | ||
// compiler will add this to "source" | ||
return global.Object({ | ||
return { | ||
'source': source, | ||
'status': status | ||
}); | ||
}; | ||
@@ -104,0 +104,0 @@ }; |
@@ -8,5 +8,5 @@ /* | ||
* Author: Diego Perini <diego.perini at gmail com> | ||
* Version: 1.3.8 | ||
* Version: 1.3.9 | ||
* Created: 20070722 | ||
* Release: 20160613 | ||
* Release: 20161026 | ||
* | ||
@@ -22,40 +22,17 @@ * License: | ||
if (typeof module == 'object' && typeof exports == 'object') { | ||
module.exports = function (browserGlobal) { | ||
// passed global does not contain | ||
// references to native objects | ||
browserGlobal.console = console; | ||
browserGlobal.parseInt = parseInt; | ||
browserGlobal.Function = Function; | ||
browserGlobal.Boolean = Boolean; | ||
browserGlobal.Number = Number; | ||
browserGlobal.RegExp = RegExp; | ||
browserGlobal.String = String; | ||
browserGlobal.Object = Object; | ||
browserGlobal.Array = Array; | ||
browserGlobal.Error = Error; | ||
browserGlobal.Date = Date; | ||
browserGlobal.Math = Math; | ||
var exports = browserGlobal.Object(); | ||
factory(browserGlobal, exports); | ||
return exports; | ||
}; | ||
module.factory = factory; | ||
module.exports = factory; | ||
} else if (typeof define === 'function' && define["amd"]) { | ||
define(factory); | ||
} else { | ||
factory(global, | ||
(global.NW || (global.NW = global.Object())) && | ||
(global.NW.Dom || (global.NW.Dom = global.Object()))); | ||
global.NW.Dom.factory = factory; | ||
global.NW || (global.NW = { }); | ||
global.NW.Dom = factory(global); | ||
} | ||
})(this, function(global, exports) { | ||
})(this, function(global) { | ||
var version = 'nwmatcher-1.3.8', | ||
var version = 'nwmatcher-1.3.9', | ||
Dom = exports, | ||
doc = global.document, | ||
root = doc.documentElement, | ||
slice = global.Array.slice, | ||
isSingleMatch, | ||
@@ -76,82 +53,78 @@ isSingleSelect, | ||
operators = '([~*^$|!]?={1})', | ||
whitespace = '[\\x20\\t\\n\\r\\f]*', | ||
combinators = '[\\x20]|[>+~](?=[^>+~])', | ||
whitespace = '[\\x20\\t\\n\\r\\f]', | ||
combinators = '\\x20|[>+~](?=[^>+~])', | ||
pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', | ||
skip_groups = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
any_esc_chr = '\\\\.', | ||
alphalodash = '[_a-zA-Z]', | ||
non_asc_chr = '[^\\x00-\\x9f]', | ||
escaped_chr = '\\\\[^\\n\\r\\f0-9a-fA-F]', | ||
unicode_chr = '\\\\[0-9a-fA-F]{1,6}(?:\\r\\n|' + whitespace + ')?', | ||
quotedvalue = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", | ||
skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', | ||
identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', | ||
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g, | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')', | ||
attributes = whitespace + '(' + encoding + '*:?' + encoding + '+)' + | ||
whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, | ||
reTrimSpaces = RegExp('[\\n\\r\\f]|^' + whitespace + '+|' + whitespace + '+$', 'g'), | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), | ||
reEscapedChars = /\\([0-9a-fA-F]{1,6}[\x20\t\n\r\f]?|.)|([\x22\x27])/g, | ||
pseudoclass = '((?:' + | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
prefixes + '|' + encoding + '+|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(.+\\)|' + whitespace + '|' + | ||
',)+)', | ||
standardValidator, extendedValidator, reValidator, | ||
extensions = '.+', | ||
attrcheck, attributes, attrmatcher, pseudoclass, | ||
standardValidator = | ||
'(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + | ||
'(' + | ||
'\\*' + | ||
'|(?:' + prefixes + identifier + ')' + | ||
'|' + combinators + | ||
'|\\[' + attributes + '\\]' + | ||
'|\\(' + pseudoclass + '\\)' + | ||
'|\\{' + extensions + '\\}' + | ||
'|(?:,|' + whitespace + ')' + | ||
')+', | ||
reOptimizeSelector, reSimpleNot, reSplitToken, | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'), | ||
Optimize, identifier, extensions = '.+', | ||
reValidator = global.RegExp(standardValidator), | ||
Patterns = { | ||
children: RegExp('^' + whitespace + '*\\>' + whitespace + '*(.*)'), | ||
adjacent: RegExp('^' + whitespace + '*\\+' + whitespace + '*(.*)'), | ||
relative: RegExp('^' + whitespace + '*\\~' + whitespace + '*(.*)'), | ||
ancestor: RegExp('^' + whitespace + '+(.*)'), | ||
universal: RegExp('^\\*(.*)') | ||
}, | ||
reTrimSpaces = global.RegExp('^' + | ||
whitespace + '|' + whitespace + '$', 'g'), | ||
Tokens = { | ||
prefixes: prefixes, | ||
identifier: identifier, | ||
attributes: attributes | ||
}, | ||
reSplitGroup = global.RegExp('(' + | ||
'[^,\\\\()[\\]]+' + | ||
'|\\[[^[\\]]*\\]|\\[.*\\]' + | ||
'|\\([^()]+\\)|\\(.*\\)' + | ||
'|\\{[^{}]+\\}|\\{.*\\}' + | ||
'|\\\\.' + | ||
')+', 'g'), | ||
QUIRKS_MODE, | ||
XML_DOCUMENT, | ||
reSplitToken = global.RegExp('(' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\x20\\t\\n\\r\\f>+~])+', 'g'), | ||
GEBTN = 'getElementsByTagName' in doc, | ||
GEBCN = 'getElementsByClassName' in doc, | ||
reWhiteSpace = /[\x20\t\n\r\f]+/g, | ||
IE_LT_9 = typeof doc.addEventListener != 'function', | ||
reOptimizeSelector = global.RegExp(identifier + '|^$'), | ||
LINK_NODES = { a: 1, A: 1, area: 1, AREA: 1, link: 1, LINK: 1 }, | ||
ATTR_BOOLEAN = global.Object({ | ||
ATTR_BOOLEAN = { | ||
checked: 1, disabled: 1, ismap: 1, | ||
multiple: 1, readonly: 1, selected: 1 | ||
}), | ||
}, | ||
ATTR_DEFAULT = global.Object({ | ||
ATTR_DEFAULT = { | ||
value: 'defaultValue', | ||
checked: 'defaultChecked', | ||
selected: 'defaultSelected' | ||
}), | ||
}, | ||
ATTR_URIDATA = global.Object({ | ||
ATTR_URIDATA = { | ||
action: 2, cite: 2, codebase: 2, data: 2, href: 2, | ||
longdesc: 2, lowsrc: 2, src: 2, usemap: 2 | ||
}), | ||
}, | ||
Selectors = global.Object(), | ||
INSENSITIVE_MAP = { | ||
'class': 0, | ||
'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, | ||
'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 | ||
}, | ||
Operators = global.Object({ | ||
Selectors = { }, | ||
Operators = { | ||
'=': "n=='%m'", | ||
@@ -163,67 +136,4 @@ '^=': "n.indexOf('%m')==0", | ||
'$=': "n.substr(n.length-'%m'.length)=='%m'" | ||
}), | ||
}, | ||
Optimize = global.Object({ | ||
ID: global.RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), | ||
TAG: global.RegExp('^(' + encoding + '+)|' + skipgroup), | ||
CLASS: global.RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) | ||
}), | ||
Patterns = global.Object({ | ||
universal: /^\*(.*)/, | ||
id: global.RegExp('^#(' + encoding + '+)(.*)'), | ||
tagName: global.RegExp('^(' + encoding + '+)(.*)'), | ||
className: global.RegExp('^\\.(' + encoding + '+)(.*)'), | ||
attribute: global.RegExp('^\\[' + attrmatcher + '\\](.*)'), | ||
children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, | ||
adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, | ||
relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, | ||
ancestor: /^[\x20\t\n\r\f]+(.*)/ | ||
}), | ||
QUIRKS_MODE, | ||
XML_DOCUMENT, | ||
GEBTN = 'getElementsByTagName' in doc, | ||
GEBCN = 'getElementsByClassName' in doc, | ||
IE_LT_9 = typeof doc.addEventListener != 'function', | ||
INSENSITIVE_MAP = global.Object({ | ||
'class': 0, | ||
'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, | ||
'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 | ||
}), | ||
TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', | ||
ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', | ||
REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', | ||
Config = global.Object({ | ||
CACHING: false, | ||
SIMPLENOT: true, | ||
UNIQUE_ID: true, | ||
USE_HTML5: true, | ||
VERBOSITY: true | ||
}), | ||
configure = | ||
function(option) { | ||
if (typeof option == 'string') { return Config[option] || Config; } | ||
if (typeof option != 'object') { return false; } | ||
for (var i in option) { | ||
Config[i] = !!option[i]; | ||
if (i == 'SIMPLENOT') { | ||
matchContexts = global.Object(); | ||
matchResolvers = global.Object(); | ||
selectContexts = global.Object(); | ||
selectResolvers = global.Object(); | ||
} | ||
} | ||
reValidator = global.RegExp(Config.SIMPLENOT ? | ||
standardValidator : extendedValidator); | ||
return true; | ||
}, | ||
concatCall = | ||
@@ -238,10 +148,2 @@ function(data, elements, callback) { | ||
emit = | ||
function(message) { | ||
if (Config.VERBOSITY) { throw global.Error(message); } | ||
if (global.console && global.console.log) { | ||
global.console.log(message); | ||
} | ||
}, | ||
switchContext = | ||
@@ -267,39 +169,54 @@ function(from, force) { | ||
codePointToUTF16 = | ||
function(codePoint) { | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\\ufffd'; | ||
} | ||
if (codePoint < 0x10000) { | ||
var lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
return '\\u' + (((codePoint - 0x10000) >> 0x0a) + 0xd800).toString(16) + | ||
'\\u' + (((codePoint - 0x10000) % 0x400) + 0xdc00).toString(16); | ||
}, | ||
stringFromCodePoint = | ||
function(codePoint) { | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\ufffd'; | ||
} | ||
if (codePoint < 0x10000) { | ||
return String.fromCharCode(codePoint); | ||
} | ||
return String.fromCodePoint ? | ||
String.fromCodePoint(codePoint) : | ||
String.fromCharCode( | ||
((codePoint - 0x10000) >> 0x0a) + 0xd800, | ||
((codePoint - 0x10000) % 0x400) + 0xdc00); | ||
}, | ||
convertEscapes = | ||
function(str) { | ||
return str.replace(/\\([0-9a-fA-F]{1,6}\x20?|.)|([\x22\x27])/g, function(substring, p1, p2) { | ||
var codePoint, highHex, highSurrogate, lowHex, lowSurrogate; | ||
if (p2) { | ||
return '\\' + p2; | ||
} | ||
if (/^[0-9a-fA-F]/.test(p1)) { | ||
codePoint = parseInt(p1, 16); | ||
if (codePoint < 0 || codePoint > 0x10ffff) { | ||
return '\\ufffd'; | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
return p2 ? '\\' + p2 : | ||
/^[0-9a-fA-F]/.test(p1) ? codePointToUTF16(parseInt(p1, 16)) : | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
p1; | ||
} | ||
); | ||
}, | ||
if (codePoint <= 0xffff) { | ||
lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
unescapeIdentifier = | ||
function(str) { | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
return p2 ? p2 : | ||
/^[0-9a-fA-F]/.test(p1) ? stringFromCodePoint(parseInt(p1, 16)) : | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
p1; | ||
} | ||
codePoint -= 0x10000; | ||
highSurrogate = (codePoint >> 10) + 0xd800; | ||
lowSurrogate = (codePoint % 0x400) + 0xdc00; | ||
highHex = '000' + highSurrogate.toString(16); | ||
lowHex = '000' + lowSurrogate.toString(16); | ||
return '\\u' + highHex.substr(highHex.length - 4) + | ||
'\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
if (/^[\\\x22\x27]/.test(p1)) { | ||
return substring; | ||
} | ||
return p1; | ||
}); | ||
); | ||
}, | ||
@@ -309,15 +226,14 @@ | ||
function(id, elements) { | ||
var i = 0, element = null; | ||
while ((element = elements[i])) { | ||
var i = -1, element; | ||
while ((element = elements[++i])) { | ||
if (element.getAttribute('id') == id) { | ||
break; | ||
} | ||
++i; | ||
} | ||
return element; | ||
return element || null; | ||
}, | ||
_byId = !('fileSize' in doc) ? | ||
_byId = !IE_LT_9 ? | ||
function(id, from) { | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
return from.getElementById && from.getElementById(id) || | ||
@@ -328,3 +244,3 @@ byIdRaw(id, from.getElementsByTagName('*')); | ||
var element = null; | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
if (XML_DOCUMENT || from.nodeType != 9) { | ||
@@ -349,3 +265,3 @@ return byIdRaw(id, from.getElementsByTagName('*')); | ||
function(tag, from) { | ||
var any = tag == '*', element = from, elements = global.Array(), next = element.firstChild; | ||
var any = tag == '*', element = from, elements = [ ], next = element.firstChild; | ||
any || (tag = tag.toUpperCase()); | ||
@@ -364,4 +280,7 @@ while ((element = next)) { | ||
getAttribute = | ||
getAttribute = !IE_LT_9 ? | ||
function(node, attribute) { | ||
return node.getAttribute(attribute); | ||
} : | ||
function(node, attribute) { | ||
attribute = attribute.toLowerCase(); | ||
@@ -379,5 +298,5 @@ if (typeof node[attribute] == 'object') { | ||
hasAttribute = root.hasAttribute ? | ||
hasAttribute = !IE_LT_9 && root.hasAttribute ? | ||
function(node, attribute) { | ||
return node.hasAttribute(attribute); | ||
return node.hasAttribute(attribute); | ||
} : | ||
@@ -390,2 +309,123 @@ function(node, attribute) { | ||
configure = | ||
function(option) { | ||
if (typeof option == 'string') { return !!Config[option]; } | ||
if (typeof option != 'object') { return Config; } | ||
for (var i in option) { | ||
Config[i] = !!option[i]; | ||
if (i == 'SIMPLENOT') { | ||
matchContexts = { }; | ||
matchResolvers = { }; | ||
selectContexts = { }; | ||
selectResolvers = { }; | ||
} | ||
} | ||
setIdentifierSyntax(); | ||
reValidator = RegExp(Config.SIMPLENOT ? | ||
standardValidator : extendedValidator); | ||
return true; | ||
}, | ||
emit = | ||
function(message) { | ||
if (Config.VERBOSITY) { throw Error(message); } | ||
if (console && console.log) { | ||
console.log(message); | ||
} | ||
}, | ||
Config = { | ||
CACHING: false, | ||
ESCAPECHR: true, | ||
NON_ASCII: true, | ||
SELECTOR3: true, | ||
UNICODE16: true, | ||
SHORTCUTS: false, | ||
SIMPLENOT: true, | ||
UNIQUE_ID: true, | ||
USE_HTML5: true, | ||
VERBOSITY: true | ||
}, | ||
initialize = | ||
function(doc) { | ||
setIdentifierSyntax(); | ||
switchContext(doc, true); | ||
}, | ||
setIdentifierSyntax = | ||
function() { | ||
var syntax = '', start = Config['SELECTOR3'] ? '-{2}|' : ''; | ||
Config['NON_ASCII'] && (syntax += '|' + non_asc_chr); | ||
Config['UNICODE16'] && (syntax += '|' + unicode_chr); | ||
Config['ESCAPECHR'] && (syntax += '|' + escaped_chr); | ||
syntax += (Config['UNICODE16'] || Config['ESCAPECHR']) ? '' : '|' + any_esc_chr; | ||
identifier = '-?(?:' + start + alphalodash + syntax + ')(?:-|[0-9]|' + alphalodash + syntax + ')*'; | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')'; | ||
attributes = whitespace + '*(' + identifier + ':?' + identifier + ')' + | ||
whitespace + '*(?:' + operators + whitespace + '*' + attrcheck + ')?' + whitespace + '*'; | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'); | ||
pseudoclass = '((?:' + | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
prefixes + identifier + '|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(.+\\)|' + whitespace + '*|' + | ||
',)+)'; | ||
standardValidator = | ||
'(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + | ||
'(' + | ||
'\\*' + | ||
'|(?:' + prefixes + identifier + ')' + | ||
'|' + combinators + | ||
'|\\[' + attributes + '\\]' + | ||
'|\\(' + pseudoclass + '\\)' + | ||
'|\\{' + extensions + '\\}' + | ||
'|(?:,|' + whitespace + '*)' + | ||
')+'; | ||
reSimpleNot = RegExp('^(' + | ||
'(?!:not)' + | ||
'(' + prefixes + identifier + | ||
'|\\([^()]*\\))+' + | ||
'|\\[' + attributes + '\\]' + | ||
')$'); | ||
reSplitToken = RegExp('(' + | ||
prefixes + identifier + '|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\x20\\t\\n\\r\\f>+~])+', 'g'); | ||
reOptimizeSelector = RegExp(identifier + '|^$'); | ||
Optimize = { | ||
ID: RegExp('^\\*?#(' + identifier + ')|' + skip_groups), | ||
TAG: RegExp('^(' + identifier + ')|' + skip_groups), | ||
CLASS: RegExp('^\\.(' + identifier + '$)|' + skip_groups) | ||
}; | ||
Patterns.id = RegExp('^#(' + identifier + ')(.*)'); | ||
Patterns.tagName = RegExp('^(' + identifier + ')(.*)'); | ||
Patterns.className = RegExp('^\\.(' + identifier + ')(.*)'); | ||
Patterns.attribute = RegExp('^\\[' + attrmatcher + '\\](.*)'); | ||
Tokens.identifier = identifier; | ||
Tokens.attributes = attributes; | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'); | ||
reValidator = RegExp(standardValidator); | ||
}, | ||
ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', | ||
REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', | ||
TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', | ||
compile = | ||
@@ -401,3 +441,3 @@ function(selector, source, mode) { | ||
} else { | ||
var i = -1, seen = global.Object(), token; | ||
var i = -1, seen = { }, token; | ||
while ((token = parts[++i])) { | ||
@@ -411,8 +451,9 @@ token = token.replace(reTrimSpaces, ''); | ||
if (mode) | ||
return global.Function('c,s,r,d,h,g,f,v', | ||
if (mode) { | ||
return Function('c,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); | ||
else | ||
return global.Function('e,s,r,d,h,g,f,v', | ||
} else { | ||
return Function('e,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=e;' + source + 'return false;'); | ||
} | ||
}, | ||
@@ -429,3 +470,3 @@ | ||
var k = 0, expr, match, name, result, status, test, type; | ||
var k = 0, expr, match, result, status, test, type; | ||
@@ -441,2 +482,3 @@ while (selector) { | ||
else if ((match = selector.match(Patterns.id))) { | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
source = 'if(' + (XML_DOCUMENT ? | ||
@@ -457,7 +499,8 @@ 's.getAttribute(e,"id")' : | ||
else if ((match = selector.match(Patterns.className))) { | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
match[1] = QUIRKS_MODE ? match[1].toLowerCase() : match[1]; | ||
source = 'if((n=' + (XML_DOCUMENT ? | ||
'e.getAttribute("class")' : 'e.className') + | ||
')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + | ||
'.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + | ||
(QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + | ||
'.replace(/' + whitespace + '+/g," ")+" ").indexOf(" ' + match[1] + ' ")>-1' + | ||
'){' + source + '}'; | ||
@@ -473,3 +516,3 @@ } | ||
if (match[2] && match[4] && (test = Operators[match[2]])) { | ||
match[4] = convertEscapes(match[4]); | ||
match[4] = (/\\/).test(match[4]) ? convertEscapes(match[4]) : match[4]; | ||
INSENSITIVE_MAP['class'] = QUIRKS_MODE ? 1 : 0; | ||
@@ -558,3 +601,5 @@ type = INSENSITIVE_MAP[match[1].toLowerCase()]; | ||
selector = selector.replace(reTrimSpaces, ''); | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
@@ -608,3 +653,5 @@ Config.SHORTCUTS && (selector = Dom.shortcuts(selector, element, from)); | ||
selector = selector.replace(reTrimSpaces, ''); | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
@@ -642,4 +689,4 @@ Config.SHORTCUTS && (selector = Dom.shortcuts(selector, from)); | ||
callback && callback(element); | ||
elements = global.Array(element); | ||
} else elements = global.Array(); | ||
elements = [element]; | ||
} else elements = [ ]; | ||
} | ||
@@ -652,3 +699,3 @@ } | ||
callback && callback(element); | ||
elements = global.Array(element); | ||
elements = [element]; | ||
} else if (/[>+~]/.test(selector)) { | ||
@@ -659,3 +706,3 @@ from = element.parentNode; | ||
} | ||
} else elements = global.Array(); | ||
} else elements = [ ]; | ||
} | ||
@@ -669,3 +716,3 @@ | ||
if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { | ||
if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; | ||
if ((elements = from.getElementsByTagName(token)).length === 0) { return [ ]; } | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); | ||
@@ -675,3 +722,3 @@ } | ||
else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { | ||
if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; | ||
if ((elements = from.getElementsByClassName(unescapeIdentifier(token))).length === 0) { return [ ]; } | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, | ||
@@ -685,4 +732,3 @@ reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); | ||
if (IE_LT_9) { | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? | ||
from.childNodes : from.all; | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.children : byTagRaw('*', from); | ||
} else { | ||
@@ -707,9 +753,9 @@ elements = from.getElementsByTagName('*'); | ||
matchContexts = global.Object(), | ||
matchResolvers = global.Object(), | ||
matchContexts = { }, | ||
matchResolvers = { }, | ||
selectContexts = global.Object(), | ||
selectResolvers = global.Object(), | ||
selectContexts = { }, | ||
selectResolvers = { }, | ||
Snapshot = global.Object({ | ||
Snapshot = { | ||
byId: _byId, | ||
@@ -720,56 +766,48 @@ match: match, | ||
hasAttribute: hasAttribute | ||
}); | ||
}, | ||
Tokens = global.Object({ | ||
prefixes: prefixes, | ||
encoding: encoding, | ||
operators: operators, | ||
whitespace: whitespace, | ||
identifier: identifier, | ||
attributes: attributes, | ||
combinators: combinators, | ||
pseudoclass: pseudoclass, | ||
pseudoparms: pseudoparms, | ||
quotedvalue: quotedvalue | ||
}); | ||
Dom = { | ||
Dom.ACCEPT_NODE = ACCEPT_NODE; | ||
ACCEPT_NODE: ACCEPT_NODE, | ||
Dom.byId = byId; | ||
Dom.match = match; | ||
Dom.first = first; | ||
Dom.select = select; | ||
Dom.compile = compile; | ||
Dom.configure = configure; | ||
byId: byId, | ||
match: match, | ||
first: first, | ||
select: select, | ||
compile: compile, | ||
configure: configure, | ||
Dom.setCache = FN; | ||
Dom.shortcuts = FN; | ||
Dom.loadResults = FN; | ||
Dom.saveResults = FN; | ||
setCache: FN, | ||
shortcuts: FN, | ||
loadResults: FN, | ||
saveResults: FN, | ||
Dom.emit = emit; | ||
Dom.Config = Config; | ||
Dom.Snapshot = Snapshot; | ||
emit: emit, | ||
Config: Config, | ||
Snapshot: Snapshot, | ||
Dom.Operators = Operators; | ||
Dom.Selectors = Selectors; | ||
Operators: Operators, | ||
Selectors: Selectors, | ||
Dom.Tokens = Tokens; | ||
Dom.Version = version; | ||
Tokens: Tokens, | ||
Version: version, | ||
Dom.registerOperator = | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}; | ||
registerOperator: | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}, | ||
Dom.registerSelector = | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = global.Object({ | ||
Expression: rexp, | ||
Callback: func | ||
})); | ||
}; | ||
registerSelector: | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = { | ||
Expression: rexp, | ||
Callback: func | ||
}); | ||
} | ||
switchContext(doc, true); | ||
}; | ||
initialize(doc); | ||
return Dom; | ||
}); |
@@ -8,5 +8,5 @@ /* | ||
* Author: Diego Perini <diego.perini at gmail com> | ||
* Version: 1.3.8 | ||
* Version: 1.3.9 | ||
* Created: 20070722 | ||
* Release: 20160613 | ||
* Release: 20161026 | ||
* | ||
@@ -22,35 +22,14 @@ * License: | ||
if (typeof module == 'object' && typeof exports == 'object') { | ||
module.exports = function (browserGlobal) { | ||
// passed global does not contain | ||
// references to native objects | ||
browserGlobal.console = console; | ||
browserGlobal.parseInt = parseInt; | ||
browserGlobal.Function = Function; | ||
browserGlobal.Boolean = Boolean; | ||
browserGlobal.Number = Number; | ||
browserGlobal.RegExp = RegExp; | ||
browserGlobal.String = String; | ||
browserGlobal.Object = Object; | ||
browserGlobal.Array = Array; | ||
browserGlobal.Error = Error; | ||
browserGlobal.Date = Date; | ||
browserGlobal.Math = Math; | ||
var exports = browserGlobal.Object(); | ||
factory(browserGlobal, exports); | ||
return exports; | ||
}; | ||
module.factory = factory; | ||
module.exports = factory; | ||
} else if (typeof define === 'function' && define["amd"]) { | ||
define(factory); | ||
} else { | ||
factory(global, | ||
(global.NW || (global.NW = global.Object())) && | ||
(global.NW.Dom || (global.NW.Dom = global.Object()))); | ||
global.NW.Dom.factory = factory; | ||
global.NW || (global.NW = { }); | ||
global.NW.Dom = factory(global); | ||
} | ||
})(this, function(global, exports) { | ||
})(this, function(global) { | ||
var version = 'nwmatcher-1.3.8', | ||
var version = 'nwmatcher-1.3.9', | ||
Dom = exports, | ||
doc = global.document, | ||
@@ -72,61 +51,47 @@ root = doc.documentElement, | ||
prefixes = '[#.:]?', | ||
operators = '([~*^$|!]?={1})', | ||
combinators = '[\\s]|[>+~](?=[^>+~])', | ||
whitespace = '[\\x20\\t\\n\\r\\f]', | ||
combinators = '\\x20|[>+~](?=[^>+~])', | ||
pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', | ||
skip_groups = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
any_esc_chr = '\\\\.', | ||
alphalodash = '[_a-zA-Z]', | ||
non_asc_chr = '[^\\x00-\\x9f]', | ||
escaped_chr = '\\\\[^\\n\\r\\f0-9a-fA-F]', | ||
unicode_chr = '\\\\[0-9a-fA-F]{1,6}(?:\\r\\n|' + whitespace + ')?', | ||
quotedvalue = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", | ||
skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', | ||
identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', | ||
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g, | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')', | ||
attributes = '\\s*(' + encoding + '*:?' + encoding + '+)\\s*(?:' + operators + '\\s*' + attrcheck + ')?\\s*', | ||
reTrimSpaces = RegExp('[\\n\\r\\f]|^' + whitespace + '+|' + whitespace + '+$', 'g'), | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), | ||
reEscapedChars = /\\([0-9a-fA-F]{1,6}[\x20\t\n\r\f]?|.)|([\x22\x27])/g, | ||
pseudoclass = '((?:' + | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
'[#.:]?|' + encoding + '+|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(.+\\)|\\s*|' + | ||
',)+)', | ||
standardValidator, extendedValidator, reValidator, | ||
extensions = '.+', | ||
attrcheck, attributes, attrmatcher, pseudoclass, | ||
standardValidator = | ||
'(?=\\s*[^>+~(){}<>])' + | ||
'(' + | ||
'\\*' + | ||
'|(?:[#.:]?' + identifier + ')' + | ||
'|' + combinators + | ||
'|\\[' + attributes + '\\]' + | ||
'|\\(' + pseudoclass + '\\)' + | ||
'|\\{' + extensions + '\\}' + | ||
'|(?:,|\\s*)' + | ||
')+', | ||
reOptimizeSelector, reSimpleNot, reSplitToken, | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'), | ||
Optimize, identifier, extensions = '.+', | ||
reValidator = global.RegExp(standardValidator), | ||
Patterns = { | ||
spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, | ||
dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(\s*(:nth(?:-last)?(?:-child|-of-type)\(\s*(?:even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\)|[^()]*)\s*\))?(.*)/i, | ||
children: RegExp('^' + whitespace + '*\\>' + whitespace + '*(.*)'), | ||
adjacent: RegExp('^' + whitespace + '*\\+' + whitespace + '*(.*)'), | ||
relative: RegExp('^' + whitespace + '*\\~' + whitespace + '*(.*)'), | ||
ancestor: RegExp('^' + whitespace + '+(.*)'), | ||
universal: RegExp('^\\*(.*)') | ||
}, | ||
reTrimSpaces = /^\s*|\s*$/g, | ||
Tokens = { | ||
prefixes: prefixes, | ||
identifier: identifier, | ||
attributes: attributes | ||
}, | ||
reSimpleNot = global.RegExp('^(' + | ||
'(?!:not)' + | ||
'([#.:]?' + | ||
'|' + identifier + | ||
'|\\([^()]*\\))+' + | ||
'|\\[' + attributes + '\\]' + | ||
')$'), | ||
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g, | ||
reSplitToken = global.RegExp('(' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\s>+~])+', 'g'), | ||
reOptimizeSelector = global.RegExp(identifier + '|^$'), | ||
QUIRKS_MODE, | ||
@@ -138,24 +103,31 @@ XML_DOCUMENT, | ||
LINK_NODES = global.Object({ a: 1, A: 1, area: 1, AREA: 1, link: 1, LINK: 1 }), | ||
IE_LT_9 = typeof doc.addEventListener != 'function', | ||
ATTR_BOOLEAN = global.Object({ | ||
LINK_NODES = { a: 1, A: 1, area: 1, AREA: 1, link: 1, LINK: 1 }, | ||
ATTR_BOOLEAN = { | ||
checked: 1, disabled: 1, ismap: 1, | ||
multiple: 1, readonly: 1, selected: 1 | ||
}), | ||
}, | ||
ATTR_DEFAULT = global.Object({ | ||
ATTR_DEFAULT = { | ||
value: 'defaultValue', | ||
checked: 'defaultChecked', | ||
selected: 'defaultSelected' | ||
}), | ||
}, | ||
ATTR_URIDATA = global.Object({ | ||
ATTR_URIDATA = { | ||
action: 2, cite: 2, codebase: 2, data: 2, href: 2, | ||
longdesc: 2, lowsrc: 2, src: 2, usemap: 2 | ||
}), | ||
}, | ||
Selectors = global.Object({ | ||
}), | ||
INSENSITIVE_MAP = { | ||
'class': 0, | ||
'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, | ||
'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 | ||
}, | ||
Operators = global.Object({ | ||
Selectors = { }, | ||
Operators = { | ||
'=': "n=='%m'", | ||
@@ -167,24 +139,4 @@ '^=': "n.indexOf('%m')==0", | ||
'$=': "n.substr(n.length-'%m'.length)=='%m'" | ||
}), | ||
}, | ||
Optimize = global.Object({ | ||
ID: global.RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), | ||
TAG: global.RegExp('^(' + encoding + '+)|' + skipgroup), | ||
CLASS: global.RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) | ||
}), | ||
Patterns = global.Object({ | ||
spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, | ||
dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(\s*(:nth(?:-last)?(?:-child|-of-type)\(\s*(?:even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\)|[^()]*)\s*\))?(.*)/i, | ||
attribute: global.RegExp('^\\[' + attrmatcher + '\\](.*)'), | ||
children: /^\s*\>\s*(.*)/, | ||
adjacent: /^\s*\+\s*(.*)/, | ||
relative: /^\s*\~\s*(.*)/, | ||
ancestor: /^\s+(.*)/, | ||
universal: /^\*(.*)/, | ||
id: global.RegExp('^#(' + encoding + '+)(.*)'), | ||
tagName: global.RegExp('^(' + encoding + '+)(.*)'), | ||
className: global.RegExp('^\\.(' + encoding + '+)(.*)') | ||
}), | ||
concatCall = | ||
@@ -219,39 +171,54 @@ function(data, elements, callback) { | ||
codePointToUTF16 = | ||
function(codePoint) { | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\\ufffd'; | ||
} | ||
if (codePoint < 0x10000) { | ||
var lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
return '\\u' + (((codePoint - 0x10000) >> 0x0a) + 0xd800).toString(16) + | ||
'\\u' + (((codePoint - 0x10000) % 0x400) + 0xdc00).toString(16); | ||
}, | ||
stringFromCodePoint = | ||
function(codePoint) { | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\ufffd'; | ||
} | ||
if (codePoint < 0x10000) { | ||
return String.fromCharCode(codePoint); | ||
} | ||
return String.fromCodePoint ? | ||
String.fromCodePoint(codePoint) : | ||
String.fromCharCode( | ||
((codePoint - 0x10000) >> 0x0a) + 0xd800, | ||
((codePoint - 0x10000) % 0x400) + 0xdc00); | ||
}, | ||
convertEscapes = | ||
function(str) { | ||
return str.replace(/\\([0-9a-fA-F]{1,6}\x20?|.)|([\x22\x27])/g, function(substring, p1, p2) { | ||
var codePoint, highHex, highSurrogate, lowHex, lowSurrogate; | ||
if (p2) { | ||
return '\\' + p2; | ||
} | ||
if (/^[0-9a-fA-F]/.test(p1)) { | ||
codePoint = parseInt(p1, 16); | ||
if (codePoint < 0 || codePoint > 0x10ffff) { | ||
return '\\ufffd'; | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
return p2 ? '\\' + p2 : | ||
/^[0-9a-fA-F]/.test(p1) ? codePointToUTF16(parseInt(p1, 16)) : | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
p1; | ||
} | ||
); | ||
}, | ||
if (codePoint <= 0xffff) { | ||
lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
unescapeIdentifier = | ||
function(str) { | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
return p2 ? p2 : | ||
/^[0-9a-fA-F]/.test(p1) ? stringFromCodePoint(parseInt(p1, 16)) : | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
p1; | ||
} | ||
codePoint -= 0x10000; | ||
highSurrogate = (codePoint >> 10) + 0xd800; | ||
lowSurrogate = (codePoint % 0x400) + 0xdc00; | ||
highHex = '000' + highSurrogate.toString(16); | ||
lowHex = '000' + lowSurrogate.toString(16); | ||
return '\\u' + highHex.substr(highHex.length - 4) + | ||
'\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
if (/^[\\\x22\x27]/.test(p1)) { | ||
return substring; | ||
} | ||
return p1; | ||
}); | ||
); | ||
}, | ||
@@ -261,3 +228,3 @@ | ||
function(id, elements) { | ||
var i = -1, element = null; | ||
var i = -1, element; | ||
while ((element = elements[++i])) { | ||
@@ -268,8 +235,8 @@ if (element.getAttribute('id') == id) { | ||
} | ||
return element; | ||
return element || null; | ||
}, | ||
_byId = !('fileSize' in doc) ? | ||
_byId = !IE_LT_9 ? | ||
function(id, from) { | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
return from.getElementById && from.getElementById(id) || | ||
@@ -280,3 +247,3 @@ byIdRaw(id, from.getElementsByTagName('*')); | ||
var element = null; | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
if (XML_DOCUMENT || from.nodeType != 9) { | ||
@@ -301,3 +268,3 @@ return byIdRaw(id, from.getElementsByTagName('*')); | ||
function(tag, from) { | ||
var any = tag == '*', element = from, elements = global.Array(), next = element.firstChild; | ||
var any = tag == '*', element = from, elements = [ ], next = element.firstChild; | ||
any || (tag = tag.toUpperCase()); | ||
@@ -321,6 +288,6 @@ while ((element = next)) { | ||
function(container, element) { | ||
return element.nodeType == 1 && container.contains(element); | ||
return container !== element && container.contains(element); | ||
} : | ||
function(container, element) { | ||
while ((element = element.parentNode) && element.nodeType == 1) { | ||
while ((element = element.parentNode)) { | ||
if (element === container) return true; | ||
@@ -331,4 +298,7 @@ } | ||
getAttribute = | ||
getAttribute = !IE_LT_9 ? | ||
function(node, attribute) { | ||
return node.getAttribute(attribute); | ||
} : | ||
function(node, attribute) { | ||
attribute = attribute.toLowerCase(); | ||
@@ -346,3 +316,3 @@ if (typeof node[attribute] == 'object') { | ||
hasAttribute = root.hasAttribute ? | ||
hasAttribute = !IE_LT_9 && root.hasAttribute ? | ||
function(node, attribute) { | ||
@@ -357,7 +327,2 @@ return node.hasAttribute(attribute); | ||
isLink = | ||
function(element) { | ||
return element.getAttribute('href') && LINK_NODES[element.nodeName]; | ||
}, | ||
isEmpty = | ||
@@ -373,2 +338,7 @@ function(node) { | ||
isLink = | ||
function(element) { | ||
return hasAttribute(element, 'href') && LINK_NODES[element.nodeName]; | ||
}, | ||
nthElement = | ||
@@ -394,14 +364,15 @@ function(element, last) { | ||
function(option) { | ||
if (typeof option == 'string') { return Config[option] || Config; } | ||
if (typeof option != 'object') { return false; } | ||
if (typeof option == 'string') { return !!Config[option]; } | ||
if (typeof option != 'object') { return Config; } | ||
for (var i in option) { | ||
Config[i] = !!option[i]; | ||
if (i == 'SIMPLENOT') { | ||
matchContexts = global.Object(); | ||
matchResolvers = global.Object(); | ||
selectContexts = global.Object(); | ||
selectResolvers = global.Object(); | ||
matchContexts = { }; | ||
matchResolvers = { }; | ||
selectContexts = { }; | ||
selectResolvers = { }; | ||
} | ||
} | ||
reValidator = global.RegExp(Config.SIMPLENOT ? | ||
setIdentifierSyntax(); | ||
reValidator = RegExp(Config.SIMPLENOT ? | ||
standardValidator : extendedValidator); | ||
@@ -413,10 +384,15 @@ return true; | ||
function(message) { | ||
if (Config.VERBOSITY) { throw global.Error(message); } | ||
if (global.console && global.console.log) { | ||
global.console.log(message); | ||
if (Config.VERBOSITY) { throw Error(message); } | ||
if (console && console.log) { | ||
console.log(message); | ||
} | ||
}, | ||
Config = global.Object({ | ||
Config = { | ||
CACHING: false, | ||
ESCAPECHR: true, | ||
NON_ASCII: true, | ||
SELECTOR3: true, | ||
UNICODE16: true, | ||
SHORTCUTS: false, | ||
SIMPLENOT: true, | ||
@@ -426,16 +402,84 @@ UNIQUE_ID: true, | ||
VERBOSITY: true | ||
}), | ||
}, | ||
IE_LT_9 = typeof doc.addEventListener != 'function', | ||
initialize = | ||
function(doc) { | ||
setIdentifierSyntax(); | ||
switchContext(doc, true); | ||
}, | ||
INSENSITIVE_MAP = global.Object({ | ||
'class': 0, | ||
'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, | ||
'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 | ||
}), | ||
setIdentifierSyntax = | ||
function() { | ||
TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', | ||
var syntax = '', start = Config['SELECTOR3'] ? '-{2}|' : ''; | ||
Config['NON_ASCII'] && (syntax += '|' + non_asc_chr); | ||
Config['UNICODE16'] && (syntax += '|' + unicode_chr); | ||
Config['ESCAPECHR'] && (syntax += '|' + escaped_chr); | ||
syntax += (Config['UNICODE16'] || Config['ESCAPECHR']) ? '' : '|' + any_esc_chr; | ||
identifier = '-?(?:' + start + alphalodash + syntax + ')(?:-|[0-9]|' + alphalodash + syntax + ')*'; | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')'; | ||
attributes = whitespace + '*(' + identifier + ':?' + identifier + ')' + | ||
whitespace + '*(?:' + operators + whitespace + '*' + attrcheck + ')?' + whitespace + '*'; | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'); | ||
pseudoclass = '((?:' + | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
prefixes + identifier + '|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(.+\\)|' + whitespace + '*|' + | ||
',)+)'; | ||
standardValidator = | ||
'(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + | ||
'(' + | ||
'\\*' + | ||
'|(?:' + prefixes + identifier + ')' + | ||
'|' + combinators + | ||
'|\\[' + attributes + '\\]' + | ||
'|\\(' + pseudoclass + '\\)' + | ||
'|\\{' + extensions + '\\}' + | ||
'|(?:,|' + whitespace + '*)' + | ||
')+'; | ||
reSimpleNot = RegExp('^(' + | ||
'(?!:not)' + | ||
'(' + prefixes + identifier + | ||
'|\\([^()]*\\))+' + | ||
'|\\[' + attributes + '\\]' + | ||
')$'); | ||
reSplitToken = RegExp('(' + | ||
prefixes + identifier + '|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\x20\\t\\n\\r\\f>+~])+', 'g'); | ||
reOptimizeSelector = RegExp(identifier + '|^$'); | ||
Optimize = { | ||
ID: RegExp('^\\*?#(' + identifier + ')|' + skip_groups), | ||
TAG: RegExp('^(' + identifier + ')|' + skip_groups), | ||
CLASS: RegExp('^\\.(' + identifier + '$)|' + skip_groups) | ||
}; | ||
Patterns.id = RegExp('^#(' + identifier + ')(.*)'); | ||
Patterns.tagName = RegExp('^(' + identifier + ')(.*)'); | ||
Patterns.className = RegExp('^\\.(' + identifier + ')(.*)'); | ||
Patterns.attribute = RegExp('^\\[' + attrmatcher + '\\](.*)'); | ||
Tokens.identifier = identifier; | ||
Tokens.attributes = attributes; | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'); | ||
reValidator = RegExp(standardValidator); | ||
}, | ||
ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', | ||
REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', | ||
TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', | ||
@@ -452,3 +496,3 @@ compile = | ||
} else { | ||
var i = -1, seen = global.Object(), token; | ||
var i = -1, seen = { }, token; | ||
while ((token = parts[++i])) { | ||
@@ -463,6 +507,6 @@ token = token.replace(reTrimSpaces, ''); | ||
if (mode) { | ||
return global.Function('c,s,r,d,h,g,f,v', | ||
return Function('c,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); | ||
} else { | ||
return global.Function('e,s,r,d,h,g,f,v', | ||
return Function('e,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=e;' + source + 'return false;'); | ||
@@ -481,3 +525,3 @@ } | ||
var a, b, n, k = 0, expr, match, name, result, status, test, type; | ||
var a, b, n, k = 0, expr, match, result, status, test, type; | ||
@@ -493,2 +537,3 @@ while (selector) { | ||
else if ((match = selector.match(Patterns.id))) { | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
source = 'if(' + (XML_DOCUMENT ? | ||
@@ -509,7 +554,8 @@ 's.getAttribute(e,"id")' : | ||
else if ((match = selector.match(Patterns.className))) { | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
match[1] = QUIRKS_MODE ? match[1].toLowerCase() : match[1]; | ||
source = 'if((n=' + (XML_DOCUMENT ? | ||
'e.getAttribute("class")' : 'e.className') + | ||
')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + | ||
'.replace(/\\s+/g," ")+" ").indexOf(" ' + | ||
(QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + | ||
'.replace(/' + whitespace + '+/g," ")+" ").indexOf(" ' + match[1] + ' ")>-1' + | ||
'){' + source + '}'; | ||
@@ -525,3 +571,3 @@ } | ||
if (match[2] && match[4] && (test = Operators[match[2]])) { | ||
match[4] = convertEscapes(match[4]); | ||
match[4] = (/\\/).test(match[4]) ? convertEscapes(match[4]) : match[4]; | ||
INSENSITIVE_MAP['class'] = QUIRKS_MODE ? 1 : 0; | ||
@@ -583,4 +629,4 @@ type = INSENSITIVE_MAP[match[1].toLowerCase()]; | ||
} else { | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? global.parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? global.parseInt(n[1], 10) : 0); | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); | ||
if (n && n[1] == '-') a = -1; | ||
@@ -731,3 +777,5 @@ } | ||
selector = selector.replace(reTrimSpaces, ''); | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
@@ -781,3 +829,5 @@ Config.SHORTCUTS && (selector = Dom.shortcuts(selector, element, from)); | ||
selector = selector.replace(reTrimSpaces, ''); | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
@@ -815,4 +865,4 @@ Config.SHORTCUTS && (selector = Dom.shortcuts(selector, from)); | ||
callback && callback(element); | ||
elements = global.Array(element); | ||
} else elements = global.Array(); | ||
elements = [element]; | ||
} else elements = [ ]; | ||
} | ||
@@ -825,3 +875,3 @@ } | ||
callback && callback(element); | ||
elements = global.Array(element); | ||
elements = [element]; | ||
} else if (/[>+~]/.test(selector)) { | ||
@@ -832,3 +882,3 @@ from = element.parentNode; | ||
} | ||
} else elements = global.Array(); | ||
} else elements = [ ]; | ||
} | ||
@@ -847,3 +897,3 @@ | ||
else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { | ||
if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) { return [ ]; } | ||
if ((elements = from.getElementsByClassName(unescapeIdentifier(token))).length === 0) { return [ ]; } | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, | ||
@@ -857,3 +907,3 @@ reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); | ||
if (IE_LT_9) { | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : from.all; | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.children : byTagRaw('*', from); | ||
} else { | ||
@@ -878,9 +928,9 @@ elements = from.getElementsByTagName('*'); | ||
matchContexts = global.Object(), | ||
matchResolvers = global.Object(), | ||
matchContexts = { }, | ||
matchResolvers = { }, | ||
selectContexts = global.Object(), | ||
selectResolvers = global.Object(), | ||
selectContexts = { }, | ||
selectResolvers = { }, | ||
Snapshot = global.Object({ | ||
Snapshot = { | ||
byId: _byId, | ||
@@ -896,45 +946,51 @@ match: match, | ||
hasAttribute: hasAttribute | ||
}); | ||
}, | ||
Dom.ACCEPT_NODE = ACCEPT_NODE; | ||
Dom = { | ||
Dom.byId = byId; | ||
Dom.match = match; | ||
Dom.first = first; | ||
Dom.select = select; | ||
Dom.compile = compile; | ||
Dom.contains = contains; | ||
Dom.configure = configure; | ||
Dom.getAttribute = getAttribute; | ||
Dom.hasAttribute = hasAttribute; | ||
ACCEPT_NODE: ACCEPT_NODE, | ||
Dom.setCache = FN; | ||
Dom.shortcuts = FN; | ||
Dom.loadResults = FN; | ||
Dom.saveResults = FN; | ||
byId: byId, | ||
match: match, | ||
first: first, | ||
select: select, | ||
compile: compile, | ||
contains: contains, | ||
configure: configure, | ||
getAttribute: getAttribute, | ||
hasAttribute: hasAttribute, | ||
Dom.emit = emit; | ||
Dom.Config = Config; | ||
Dom.Snapshot = Snapshot; | ||
setCache: FN, | ||
shortcuts: FN, | ||
loadResults: FN, | ||
saveResults: FN, | ||
Dom.Operators = Operators; | ||
Dom.Selectors = Selectors; | ||
emit: emit, | ||
Config: Config, | ||
Snapshot: Snapshot, | ||
Dom.Version = version; | ||
Operators: Operators, | ||
Selectors: Selectors, | ||
Dom.registerOperator = | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}; | ||
Tokens: Tokens, | ||
Version: version, | ||
Dom.registerSelector = | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = global.Object({ | ||
Expression: rexp, | ||
Callback: func | ||
})); | ||
}; | ||
registerOperator: | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}, | ||
switchContext(doc, true); | ||
registerSelector: | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = { | ||
Expression: rexp, | ||
Callback: func | ||
}); | ||
} | ||
}; | ||
initialize(doc); | ||
return Dom; | ||
}); |
@@ -8,5 +8,5 @@ /* | ||
* Author: Diego Perini <diego.perini at gmail com> | ||
* Version: 1.3.8 | ||
* Version: 1.3.9 | ||
* Created: 20070722 | ||
* Release: 20160613 | ||
* Release: 20161026 | ||
* | ||
@@ -22,39 +22,14 @@ * License: | ||
if (typeof module == 'object' && typeof exports == 'object') { | ||
// in a Node.js environment, the nwmatcher functions will operate on | ||
// the passed "browserGlobal" and will be returned in an object | ||
module.exports = function (browserGlobal) { | ||
// passed global does not contain | ||
// references to native objects | ||
browserGlobal.console = console; | ||
browserGlobal.parseInt = parseInt; | ||
browserGlobal.Function = Function; | ||
browserGlobal.Boolean = Boolean; | ||
browserGlobal.Number = Number; | ||
browserGlobal.RegExp = RegExp; | ||
browserGlobal.String = String; | ||
browserGlobal.Object = Object; | ||
browserGlobal.Array = Array; | ||
browserGlobal.Error = Error; | ||
browserGlobal.Date = Date; | ||
browserGlobal.Math = Math; | ||
var exports = browserGlobal.Object(); | ||
factory(browserGlobal, exports); | ||
return exports; | ||
}; | ||
module.factory = factory; | ||
module.exports = factory; | ||
} else if (typeof define === 'function' && define["amd"]) { | ||
define(factory); | ||
} else { | ||
// in a browser environment, the nwmatcher functions will operate on | ||
// the "global" loading them and be attached to "global.NW.Dom" | ||
factory(global, | ||
(global.NW || (global.NW = global.Object())) && | ||
(global.NW.Dom || (global.NW.Dom = global.Object()))); | ||
global.NW.Dom.factory = factory; | ||
global.NW || (global.NW = { }); | ||
global.NW.Dom = factory(global); | ||
} | ||
})(this, function(global, exports) { | ||
})(this, function(global) { | ||
var version = 'nwmatcher-1.3.8', | ||
var version = 'nwmatcher-1.3.9', | ||
Dom = exports, | ||
// processing context & root element | ||
@@ -65,4 +40,3 @@ doc = global.document, | ||
// save utility methods references | ||
slice = global.Array.prototype.slice, | ||
string = global.Object.prototype.toString, | ||
slice = [ ].slice, | ||
@@ -91,6 +65,6 @@ // persist previous parsed data | ||
// accepted whitespace characters | ||
whitespace = '[\\x20\\t\\n\\r\\f]*', | ||
whitespace = '[\\x20\\t\\n\\r\\f]', | ||
// 4 combinators F E, F>E, F+E, F~E | ||
combinators = '[\\x20]|[>+~](?=[^>+~])', | ||
combinators = '\\x20|[>+~](?=[^>+~])', | ||
@@ -100,112 +74,76 @@ // an+b format params for pseudo-classes | ||
// CSS quoted string values | ||
quotedvalue = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", | ||
// skip round brackets groups | ||
skipround = '\\([^()]+\\)|\\(.*\\)', | ||
// skip curly brackets groups | ||
skipcurly = '\\{[^{}]+\\}|\\{.*\\}', | ||
// skip square brackets groups | ||
skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', | ||
// skip [ ], ( ), { } brackets groups | ||
skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
skip_groups = '\\[.*\\]|\\(.*\\)|\\{.*\\}', | ||
// http://www.w3.org/TR/css3-syntax/#characters | ||
// unicode/ISO 10646 characters 161 and higher | ||
// NOTE: Safari 2.0.x crashes with escaped (\\) | ||
// Unicode ranges in regular expressions so we | ||
// use a negated character range class instead | ||
encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', | ||
// any escaped char | ||
any_esc_chr = '\\\\.', | ||
// alpha chars & low dash | ||
alphalodash = '[_a-zA-Z]', | ||
// non-ascii chars (utf-8) | ||
non_asc_chr = '[^\\x00-\\x9f]', | ||
// escape sequences in strings | ||
escaped_chr = '\\\\[^\\n\\r\\f0-9a-fA-F]', | ||
// Unicode chars including trailing whitespace | ||
unicode_chr = '\\\\[0-9a-fA-F]{1,6}(?:\\r\\n|' + whitespace + ')?', | ||
// CSS identifier syntax | ||
identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', | ||
// CSS quoted string values | ||
quotedvalue = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", | ||
// build attribute string | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')', | ||
attributes = whitespace + '(' + encoding + '*:?' + encoding + '+)' + | ||
whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), | ||
// regular expression used to skip single/nested brackets groups (round, square, curly) | ||
// used to split comma groups excluding commas inside quotes '' "" or brackets () [] {} | ||
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g, | ||
// build pseudoclass string | ||
pseudoclass = '((?:' + | ||
// an+b parameters or quoted string | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
// id, class, pseudo-class selector | ||
prefixes + '|' + encoding + '+|' + | ||
// nested HTML attribute selector | ||
'\\[' + attributes + '\\]|' + | ||
// nested pseudo-class selector | ||
'\\(.+\\)|' + whitespace + '|' + | ||
// nested pseudos/separators | ||
',)+)', | ||
// regular expression to trim extra leading/trailing whitespace in selector strings | ||
// whitespace is any combination of these 5 character [\x20\t\n\r\f] | ||
// http://www.w3.org/TR/css3-selectors/#selector-syntax | ||
reTrimSpaces = RegExp('[\\n\\r\\f]|^' + whitespace + '+|' + whitespace + '+$', 'g'), | ||
// placeholder for extensions | ||
extensions = '.+', | ||
// regular expression used in convertEscapes and unescapeIdentifier | ||
reEscapedChars = /\\([0-9a-fA-F]{1,6}[\x20\t\n\r\f]?|.)|([\x22\x27])/g, | ||
// CSS3: syntax scanner and | ||
// one pass validation only | ||
// using regular expression | ||
standardValidator = | ||
// discard start | ||
'(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + | ||
// open match group | ||
'(' + | ||
//universal selector | ||
'\\*' + | ||
// id/class/tag/pseudo-class identifier | ||
'|(?:' + prefixes + identifier + ')' + | ||
// combinator selector | ||
'|' + combinators + | ||
// HTML attribute selector | ||
'|\\[' + attributes + '\\]' + | ||
// pseudo-classes parameters | ||
'|\\(' + pseudoclass + '\\)' + | ||
// dom properties selector (extension) | ||
'|\\{' + extensions + '\\}' + | ||
// selector group separator (comma) | ||
'|(?:,|' + whitespace + ')' + | ||
// close match group | ||
')+', | ||
// for in excess whitespace removal | ||
reWhiteSpace = /[\x20\t\n\r\f]+/g, | ||
// validator for complex selectors in ':not()' pseudo-classes | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'), | ||
standardValidator, extendedValidator, reValidator, | ||
// validator for standard selectors as default | ||
reValidator = new global.RegExp(standardValidator), | ||
attrcheck, attributes, attrmatcher, pseudoclass, | ||
// whitespace is any combination of these 5 character [\x20\t\n\r\f] | ||
// http://www.w3.org/TR/css3-selectors/#selector-syntax | ||
reTrimSpaces = new global.RegExp('^' + | ||
whitespace + '|' + whitespace + '$', 'g'), | ||
reOptimizeSelector, reSimpleNot, reSplitToken, | ||
// only allow simple selectors nested in ':not()' pseudo-classes | ||
reSimpleNot = new global.RegExp('^(' + | ||
'(?!:not)' + | ||
'(' + prefixes + | ||
'|' + identifier + | ||
'|\\([^()]*\\))+' + | ||
'|\\[' + attributes + '\\]' + | ||
')$'), | ||
Optimize, reClass, reSimpleSelector, | ||
// split comma groups, exclude commas from | ||
// quotes '' "" and from brackets () [] {} | ||
reSplitGroup = new global.RegExp('(' + | ||
'[^,\\\\()[\\]]+' + | ||
'|' + skipsquare + | ||
'|' + skipround + | ||
'|' + skipcurly + | ||
'|\\\\.' + | ||
')+', 'g'), | ||
// http://www.w3.org/TR/css3-syntax/#characters | ||
// unicode/ISO 10646 characters \xA0 and higher | ||
// NOTE: Safari 2.0.x crashes with escaped (\\) | ||
// Unicode ranges in regular expressions so we | ||
// use a negated character range class instead | ||
// now assigned at runtime from config options | ||
identifier, | ||
// split last, right most, selector group token | ||
reSplitToken = new global.RegExp('(' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\x20\\t\\r\\n\\f>+~])+', 'g'), | ||
// placeholder for extensions | ||
extensions = '.+', | ||
// for in excess whitespace removal | ||
reWhiteSpace = /[\x20\t\n\r\f]+/g, | ||
// precompiled Regular Expressions | ||
Patterns = { | ||
// structural pseudo-classes and child selectors | ||
spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, | ||
// uistates + dynamic + negation pseudo-classes | ||
dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(\s*(:nth(?:-last)?(?:-child|-of-type)\(\s*(?:even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\)|[^()]*)\s*\))?(.*)/i, | ||
// E > F | ||
children: RegExp('^' + whitespace + '*\\>' + whitespace + '*(.*)'), | ||
// E + F | ||
adjacent: RegExp('^' + whitespace + '*\\+' + whitespace + '*(.*)'), | ||
// E ~ F | ||
relative: RegExp('^' + whitespace + '*\\~' + whitespace + '*(.*)'), | ||
// E F | ||
ancestor: RegExp('^' + whitespace + '+(.*)'), | ||
// all | ||
universal: RegExp('^\\*(.*)') | ||
}, | ||
reOptimizeSelector = new global.RegExp(identifier + '|^$'), | ||
Tokens = { | ||
prefixes: prefixes, | ||
identifier: identifier, | ||
attributes: attributes | ||
}, | ||
@@ -217,3 +155,3 @@ /*----------------------------- FEATURE TESTING ----------------------------*/ | ||
var re = / \w+\(/, | ||
isnative = String(Object.prototype.toString).replace(re, ' ('); | ||
isnative = String(({ }).toString).replace(re, ' ('); | ||
return function(method) { | ||
@@ -259,3 +197,3 @@ return method && typeof method != 'string' && | ||
(function() { | ||
var isBuggy = true, x = 'x' + global.String(+new global.Date), | ||
var isBuggy = true, x = 'x' + String(+new Date), | ||
a = doc.createElementNS ? 'a' : '<a name="' + x + '">'; | ||
@@ -335,6 +273,7 @@ (a = doc.createElement(a)).name = x; | ||
// detect Opera browser | ||
OPERA = /opera/i.test(string.call(global.opera)), | ||
OPERA = typeof global.opera != 'undefined' && | ||
(/opera/i).test(({ }).toString.call(global.opera)), | ||
// skip simple selector optimizations for Opera >= 11 | ||
OPERA_QSAPI = OPERA && global.parseFloat(global.opera.version()) >= 11, | ||
OPERA_QSAPI = OPERA && parseFloat(global.opera.version()) >= 11, | ||
@@ -344,3 +283,3 @@ // check Selector API implementations | ||
(function() { | ||
var pattern = new global.Array(), context, element, | ||
var pattern = [ ], context, element, | ||
@@ -413,3 +352,3 @@ expect = function(selector, element, n) { | ||
return pattern.length ? | ||
new global.RegExp(pattern.join('|')) : | ||
RegExp(pattern.join('|')) : | ||
{ 'test': function() { return false; } }; | ||
@@ -420,39 +359,30 @@ | ||
// matches class selectors | ||
RE_CLASS = new global.RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), | ||
/*----------------------------- LOOKUP OBJECTS -----------------------------*/ | ||
// matches simple id, tag & class selectors | ||
RE_SIMPLE_SELECTOR = new global.RegExp( | ||
BUGGY_GEBTN && BUGGY_GEBCN || OPERA ? | ||
'^#?-?[_a-zA-Z]{1}' + encoding + '*$' : BUGGY_GEBTN ? | ||
'^[.#]?-?[_a-zA-Z]{1}' + encoding + '*$' : BUGGY_GEBCN ? | ||
'^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : | ||
'^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$'), | ||
IE_LT_9 = typeof doc.addEventListener != 'function', | ||
/*----------------------------- LOOKUP OBJECTS -----------------------------*/ | ||
LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, | ||
LINK_NODES = new global.Object({ 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }), | ||
// boolean attributes should return attribute name instead of true/false | ||
ATTR_BOOLEAN = new global.Object({ | ||
ATTR_BOOLEAN = { | ||
'checked': 1, 'disabled': 1, 'ismap': 1, | ||
'multiple': 1, 'readonly': 1, 'selected': 1 | ||
}), | ||
}, | ||
// dynamic attributes that needs to be checked against original HTML value | ||
ATTR_DEFAULT = new global.Object({ | ||
ATTR_DEFAULT = { | ||
'value': 'defaultValue', | ||
'checked': 'defaultChecked', | ||
'selected': 'defaultSelected' | ||
}), | ||
}, | ||
// attributes referencing URI data values need special treatment in IE | ||
ATTR_URIDATA = new global.Object({ | ||
ATTR_URIDATA = { | ||
'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, | ||
'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 | ||
}), | ||
}, | ||
// HTML 5 draft specifications | ||
// http://www.whatwg.org/specs/web-apps/current-work/#selectors | ||
HTML_TABLE = new global.Object({ | ||
HTML_TABLE = { | ||
// class attribute must be treated case-insensitive in HTML quirks mode | ||
@@ -470,7 +400,7 @@ // initialized by default to Standard Mode (case-sensitive), | ||
'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 | ||
}), | ||
}, | ||
// the following attributes must be treated case-insensitive in XHTML mode | ||
// Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity | ||
XHTML_TABLE = new global.Object({ | ||
XHTML_TABLE = { | ||
'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, | ||
@@ -481,3 +411,3 @@ 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, | ||
'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 | ||
}), | ||
}, | ||
@@ -487,3 +417,3 @@ /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ | ||
// placeholder to add functionalities | ||
Selectors = new global.Object({ | ||
Selectors = { | ||
// as a simple example this will check | ||
@@ -500,6 +430,6 @@ // for chars not in standard ascii table | ||
// checks and only if none of them worked | ||
}), | ||
}, | ||
// attribute operators | ||
Operators = new global.Object({ | ||
Operators = { | ||
'=': "n=='%m'", | ||
@@ -511,37 +441,4 @@ '^=': "n.indexOf('%m')==0", | ||
'$=': "n.substr(n.length-'%m'.length)=='%m'" | ||
}), | ||
}, | ||
// optimization expressions | ||
Optimize = new global.Object({ | ||
ID: new global.RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), | ||
TAG: new global.RegExp('^(' + encoding + '+)|' + skipgroup), | ||
CLASS: new global.RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) | ||
}), | ||
// precompiled Regular Expressions | ||
Patterns = new global.Object({ | ||
// structural pseudo-classes and child selectors | ||
spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, | ||
// uistates + dynamic + negation pseudo-classes | ||
dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(\s*(:nth(?:-last)?(?:-child|-of-type)\(\s*(?:even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\)|[^()]*)\s*\))?(.*)/i, | ||
// element attribute matcher | ||
attribute: new global.RegExp('^\\[' + attrmatcher + '\\](.*)'), | ||
// E > F | ||
children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, | ||
// E + F | ||
adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, | ||
// E ~ F | ||
relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, | ||
// E F | ||
ancestor: /^[\x20\t\n\r\f]+(.*)/, | ||
// all | ||
universal: /^\*(.*)/, | ||
// id | ||
id: new global.RegExp('^#(' + encoding + '+)(.*)'), | ||
// tag | ||
tagName: new global.RegExp('^(' + encoding + '+)(.*)'), | ||
// class | ||
className: new global.RegExp('^\\.(' + encoding + '+)(.*)') | ||
}), | ||
/*------------------------------ UTIL METHODS ------------------------------*/ | ||
@@ -553,4 +450,4 @@ | ||
var i = -1, element; | ||
if (!data.length && global.Array.slice) | ||
return global.Array.slice(elements); | ||
if (!data.length && Array.slice) | ||
return Array.slice(elements); | ||
while ((element = elements[++i])) | ||
@@ -624,49 +521,72 @@ data[data.length] = element; | ||
// convert a CSS string or identifier containing escape sequence to a | ||
// javascript string with javascript escape sequences | ||
// convert single codepoint to UTF-16 encoding | ||
codePointToUTF16 = | ||
function(codePoint) { | ||
// out of range, use replacement character | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\\ufffd'; | ||
} | ||
// javascript strings are UTF-16 encoded | ||
if (codePoint < 0x10000) { | ||
var lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
// supplementary high + low surrogates | ||
return '\\u' + (((codePoint - 0x10000) >> 0x0a) + 0xd800).toString(16) + | ||
'\\u' + (((codePoint - 0x10000) % 0x400) + 0xdc00).toString(16); | ||
}, | ||
// convert single codepoint to string | ||
stringFromCodePoint = | ||
function(codePoint) { | ||
// out of range, use replacement character | ||
if (codePoint < 1 || codePoint > 0x10ffff || | ||
(codePoint > 0xd7ff && codePoint < 0xe000)) { | ||
return '\ufffd'; | ||
} | ||
if (codePoint < 0x10000) { | ||
return String.fromCharCode(codePoint); | ||
} | ||
return String.fromCodePoint ? | ||
String.fromCodePoint(codePoint) : | ||
String.fromCharCode( | ||
((codePoint - 0x10000) >> 0x0a) + 0xd800, | ||
((codePoint - 0x10000) % 0x400) + 0xdc00); | ||
}, | ||
// convert escape sequence in a CSS string or identifier | ||
// to javascript string with javascript escape sequences | ||
convertEscapes = | ||
function(str) { | ||
return str.replace(/\\([0-9a-fA-F]{1,6}\x20?|.)|([\x22\x27])/g, function(substring, p1, p2) { | ||
var codePoint, highHex, highSurrogate, lowHex, lowSurrogate; | ||
if (p2) { | ||
// unescaped " or ' | ||
return '\\' + p2; | ||
} | ||
if (/^[0-9a-fA-F]/.test(p1)) { | ||
// \1f23 | ||
codePoint = parseInt(p1, 16); | ||
if (codePoint < 0 || codePoint > 0x10ffff) { | ||
// the replacement character | ||
return '\\ufffd'; | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
// unescaped " or ' | ||
return p2 ? '\\' + p2 : | ||
// javascript strings are UTF-16 encoded | ||
/^[0-9a-fA-F]/.test(p1) ? codePointToUTF16(parseInt(p1, 16)) : | ||
// \' \" | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
// \g \h \. \# etc | ||
p1; | ||
} | ||
); | ||
}, | ||
// javascript strings are in UTF-16 | ||
if (codePoint <= 0xffff) { | ||
// Basic | ||
lowHex = '000' + codePoint.toString(16); | ||
return '\\u' + lowHex.substr(lowHex.length - 4); | ||
// convert escape sequence in a CSS string or identifier | ||
// to javascript string with characters representations | ||
unescapeIdentifier = | ||
function(str) { | ||
return str.replace(reEscapedChars, | ||
function(substring, p1, p2) { | ||
// unescaped " or ' | ||
return p2 ? p2 : | ||
// javascript strings are UTF-16 encoded | ||
/^[0-9a-fA-F]/.test(p1) ? stringFromCodePoint(parseInt(p1, 16)) : | ||
// \' \" | ||
/^[\\\x22\x27]/.test(p1) ? substring : | ||
// \g \h \. \# etc | ||
p1; | ||
} | ||
// Supplementary | ||
codePoint -= 0x10000; | ||
highSurrogate = (codePoint >> 10) + 0xd800; | ||
lowSurrogate = (codePoint % 0x400) + 0xdc00; | ||
highHex = '000' + highSurrogate.toString(16); | ||
lowHex = '000' + lowSurrogate.toString(16); | ||
return '\\u' + highHex.substr(highHex.length - 4) + | ||
'\\u' + lowHex.substr(lowHex.length - 4); | ||
} | ||
if (/^[\\\x22\x27]/.test(p1)) { | ||
// \' \" | ||
return substring; | ||
} | ||
// \g \h \. \# etc | ||
return p1; | ||
}); | ||
); | ||
}, | ||
@@ -680,3 +600,3 @@ | ||
function(id, elements) { | ||
var i = -1, element = null; | ||
var i = -1, element; | ||
while ((element = elements[++i])) { | ||
@@ -687,3 +607,3 @@ if (element.getAttribute('id') == id) { | ||
} | ||
return element; | ||
return element || null; | ||
}, | ||
@@ -695,3 +615,3 @@ | ||
function(id, from) { | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
return from.getElementById && from.getElementById(id) || | ||
@@ -702,3 +622,3 @@ byIdRaw(id, from.getElementsByTagName('*')); | ||
var element = null; | ||
id = id.replace(/\\([^\\]{1})/g, '$1'); | ||
id = (/\\/).test(id) ? unescapeIdentifier(id) : id; | ||
if (XML_DOCUMENT || from.nodeType != 9) { | ||
@@ -727,3 +647,3 @@ return byIdRaw(id, from.getElementsByTagName('*')); | ||
function(tag, from) { | ||
var any = tag == '*', element = from, elements = new global.Array(), next = element.firstChild; | ||
var any = tag == '*', element = from, elements = [ ], next = element.firstChild; | ||
any || (tag = tag.toUpperCase()); | ||
@@ -750,8 +670,10 @@ while ((element = next)) { | ||
function(tag, from) { | ||
var i = -1, j = i, data = new global.Array(), | ||
element, elements = from.getElementsByTagName(tag); | ||
var i = -1, j = i, data = [ ], element, | ||
elements = XML_DOCUMENT || from.nodeType == 11 ? | ||
byTagRaw(tag, from) : from.getElementsByTagName(tag); | ||
if (tag == '*') { | ||
while ((element = elements[++i])) { | ||
if (element.nodeName > '@') | ||
if (element.nodeName > '@') { | ||
data[++j] = element; | ||
} | ||
} | ||
@@ -786,4 +708,4 @@ } else { | ||
function(name, from) { | ||
var i = -1, j = i, data = new global.Array(), element, elements = _byTag('*', from), n; | ||
name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\([^\\]{1})/g, '$1') + ' '; | ||
var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; | ||
name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name) + ' '; | ||
while ((element = elements[++i])) { | ||
@@ -803,4 +725,6 @@ n = XML_DOCUMENT ? element.getAttribute('class') : element.className; | ||
function(name, from) { | ||
name = QUIRKS_MODE ? name.toLowerCase() : name; | ||
name = (/\\/).test(name) ? unescapeIdentifier(name) : name; | ||
return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? | ||
byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\([^\\]{1})/g, '$1')), 0); | ||
byClassRaw(name, from) : slice.call(from.getElementsByClassName(name)); | ||
}, | ||
@@ -835,3 +759,3 @@ | ||
// @return string | ||
getAttribute = !BUGGY_GET_ATTRIBUTE ? | ||
getAttribute = !BUGGY_GET_ATTRIBUTE && !IE_LT_9 ? | ||
function(node, attribute) { | ||
@@ -858,3 +782,3 @@ return node.getAttribute(attribute); | ||
// @return boolean | ||
hasAttribute = !BUGGY_HAS_ATTRIBUTE ? | ||
hasAttribute = !BUGGY_HAS_ATTRIBUTE && !IE_LT_9 ? | ||
function(node, attribute) { | ||
@@ -918,11 +842,11 @@ return XML_DOCUMENT ? | ||
function(option) { | ||
if (typeof option == 'string') { return Config[option] || Config; } | ||
if (typeof option != 'object') { return false; } | ||
if (typeof option == 'string') { return !!Config[option]; } | ||
if (typeof option != 'object') { return Config; } | ||
for (var i in option) { | ||
Config[i] = !!option[i]; | ||
if (i == 'SIMPLENOT') { | ||
matchContexts = new global.Object(); | ||
matchResolvers = new global.Object(); | ||
selectContexts = new global.Object(); | ||
selectResolvers = new global.Object(); | ||
matchContexts = { }; | ||
matchResolvers = { }; | ||
selectContexts = { }; | ||
selectResolvers = { }; | ||
if (!Config[i]) { Config['USE_QSAPI'] = false; } | ||
@@ -933,3 +857,4 @@ } else if (i == 'USE_QSAPI') { | ||
} | ||
reValidator = new global.RegExp(Config.SIMPLENOT ? | ||
setIdentifierSyntax(); | ||
reValidator = RegExp(Config.SIMPLENOT ? | ||
standardValidator : extendedValidator); | ||
@@ -942,9 +867,9 @@ return true; | ||
function(message) { | ||
if (Config.VERBOSITY) { throw new global.Error(message); } | ||
if (global.console && global.console.log) { | ||
global.console.log(message); | ||
if (Config.VERBOSITY) { throw Error(message); } | ||
if (console && console.log) { | ||
console.log(message); | ||
} | ||
}, | ||
Config = new global.Object({ | ||
Config = { | ||
@@ -954,2 +879,14 @@ // used to enable/disable caching of result sets | ||
// used to enable/disable CSS escaped identifiers | ||
ESCAPECHR: true, | ||
// add non-ascii (utf-8) to the identifier syntax RE | ||
NON_ASCII: true, | ||
// switch between CSS2 and CSS3 identifier syntax RE | ||
SELECTOR3: true, | ||
// add Unicode (utf-16) to the identifier syntax RE | ||
UNICODE16: true, | ||
// by default do not add missing left/right context | ||
@@ -977,6 +914,121 @@ // to selector string shortcuts like "+div" or "ul>" | ||
}), | ||
}, | ||
/*---------------------------- COMPILER METHODS ----------------------------*/ | ||
// init REs and context | ||
initialize = | ||
function(doc) { | ||
setIdentifierSyntax(); | ||
switchContext(doc, true); | ||
}, | ||
// set/reset default identifier syntax | ||
// based on user configuration options | ||
// rebuild the validator and other REs | ||
setIdentifierSyntax = | ||
function() { | ||
var syntax = '', start = Config['SELECTOR3'] ? '-{2}|' : ''; | ||
Config['NON_ASCII'] && (syntax += '|' + non_asc_chr); | ||
Config['UNICODE16'] && (syntax += '|' + unicode_chr); | ||
Config['ESCAPECHR'] && (syntax += '|' + escaped_chr); | ||
syntax += (Config['UNICODE16'] || Config['ESCAPECHR']) ? '' : '|' + any_esc_chr; | ||
identifier = '-?(?:' + start + alphalodash + syntax + ')(?:-|[0-9]|' + alphalodash + syntax + ')*'; | ||
// build attribute string | ||
attrcheck = '(' + quotedvalue + '|' + identifier + ')'; | ||
attributes = whitespace + '*(' + identifier + ':?' + identifier + ')' + | ||
whitespace + '*(?:' + operators + whitespace + '*' + attrcheck + ')?' + whitespace + '*'; | ||
attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'); | ||
// build pseudoclass string | ||
pseudoclass = '((?:' + | ||
// an+b parameters or quoted string | ||
pseudoparms + '|' + quotedvalue + '|' + | ||
// id, class, pseudo-class selector | ||
prefixes + identifier + '|' + | ||
// nested HTML attribute selector | ||
'\\[' + attributes + '\\]|' + | ||
// nested pseudo-class selector | ||
'\\(.+\\)|' + whitespace + '*|' + | ||
// nested pseudos/separators | ||
',)+)'; | ||
// CSS3: syntax scanner and | ||
// one pass validation only | ||
// using regular expression | ||
standardValidator = | ||
// discard start | ||
'(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + | ||
// open match group | ||
'(' + | ||
//universal selector | ||
'\\*' + | ||
// id/class/tag/pseudo-class identifier | ||
'|(?:' + prefixes + identifier + ')' + | ||
// combinator selector | ||
'|' + combinators + | ||
// HTML attribute selector | ||
'|\\[' + attributes + '\\]' + | ||
// pseudo-classes parameters | ||
'|\\(' + pseudoclass + '\\)' + | ||
// dom properties selector (extension) | ||
'|\\{' + extensions + '\\}' + | ||
// selector group separator (comma) | ||
'|(?:,|' + whitespace + '*)' + | ||
// close match group | ||
')+'; | ||
// only allow simple selectors nested in ':not()' pseudo-classes | ||
reSimpleNot = RegExp('^(' + | ||
'(?!:not)' + | ||
'(' + prefixes + identifier + | ||
'|\\([^()]*\\))+' + | ||
'|\\[' + attributes + '\\]' + | ||
')$'); | ||
// split last, right most, selector group token | ||
reSplitToken = RegExp('(' + | ||
prefixes + identifier + '|' + | ||
'\\[' + attributes + '\\]|' + | ||
'\\(' + pseudoclass + '\\)|' + | ||
'\\\\.|[^\\x20\\t\\n\\r\\f>+~])+', 'g'); | ||
reOptimizeSelector = RegExp(identifier + '|^$'); | ||
reSimpleSelector = RegExp( | ||
BUGGY_GEBTN && BUGGY_GEBCN || OPERA ? | ||
'^#?' + identifier + '$' : BUGGY_GEBTN ? | ||
'^[.#]?' + identifier + '$' : BUGGY_GEBCN ? | ||
'^(?:\\*|#' + identifier + ')$' : | ||
'^(?:\\*|[.#]?' + identifier + ')$'); | ||
// matches class selectors | ||
reClass = RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'); | ||
Optimize = { | ||
ID: RegExp('^\\*?#(' + identifier + ')|' + skip_groups), | ||
TAG: RegExp('^(' + identifier + ')|' + skip_groups), | ||
CLASS: RegExp('^\\.(' + identifier + '$)|' + skip_groups) | ||
}; | ||
Patterns.id = RegExp('^#(' + identifier + ')(.*)'); | ||
Patterns.tagName = RegExp('^(' + identifier + ')(.*)'); | ||
Patterns.className = RegExp('^\\.(' + identifier + ')(.*)'); | ||
Patterns.attribute = RegExp('^\\[' + attrmatcher + '\\](.*)'); | ||
Tokens.identifier = identifier; | ||
Tokens.attributes = attributes; | ||
// validator for complex selectors in ':not()' pseudo-classes | ||
extendedValidator = standardValidator.replace(pseudoclass, '.*'); | ||
// validator for standard selectors as default | ||
reValidator = RegExp(standardValidator); | ||
}, | ||
// code string reused to build compiled functions | ||
@@ -1000,3 +1052,3 @@ ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', | ||
// for each selector in the group | ||
var i = -1, seen = new global.Object(), token; | ||
var i = -1, seen = { }, token; | ||
while ((token = parts[++i])) { | ||
@@ -1014,7 +1066,7 @@ token = token.replace(reTrimSpaces, ''); | ||
// for select method | ||
return new global.Function('c,s,r,d,h,g,f,v', | ||
return Function('c,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); | ||
} else { | ||
// for match method | ||
return new global.Function('e,s,r,d,h,g,f,v', | ||
return Function('e,s,r,d,h,g,f,v', | ||
'var N,n,x=0,k=e;' + source + 'return false;'); | ||
@@ -1055,2 +1107,3 @@ } | ||
// prototype selector unit need this method to recover bad HTML forms | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
source = 'if(' + (XML_DOCUMENT ? | ||
@@ -1080,7 +1133,8 @@ 's.getAttribute(e,"id")' : | ||
// and notes at the bottom; explicitly non-normative in this specification. | ||
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1]; | ||
match[1] = QUIRKS_MODE ? match[1].toLowerCase() : match[1]; | ||
source = 'if((n=' + (XML_DOCUMENT ? | ||
's.getAttribute(e,"class")' : 'e.className') + | ||
')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + | ||
'.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + | ||
(QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + | ||
'.replace(/' + whitespace + '+/g," ")+" ").indexOf(" ' + match[1] + ' ")>-1' + | ||
'){' + source + '}'; | ||
@@ -1107,3 +1161,3 @@ } | ||
if (match[2] && match[4] && (test = Operators[match[2]])) { | ||
match[4] = convertEscapes(match[4]); | ||
match[4] = (/\\/).test(match[4]) ? convertEscapes(match[4]) : match[4]; | ||
// case treatment depends on document | ||
@@ -1193,4 +1247,4 @@ HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; | ||
// assumes correct "an+b" format, "b" before "a" to keep "n" values | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? global.parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? global.parseInt(n[1], 10) : 0); | ||
b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); | ||
a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); | ||
if (n && n[1] == '-') a = -1; | ||
@@ -1405,3 +1459,8 @@ } | ||
selector = selector.replace(reTrimSpaces, ''); | ||
// normalize the selector string, remove [\n\r\f] | ||
// whitespace, replace codepoints 0 with '\ufffd' | ||
// trim non-relevant leading/trailing whitespaces | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
@@ -1429,3 +1488,3 @@ Config.SHORTCUTS && (selector = Dom.shortcuts(selector, element, from)); | ||
return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, new global.Object()); | ||
return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); | ||
}, | ||
@@ -1467,3 +1526,10 @@ | ||
if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { | ||
// normalize the selector string, remove [\n\r\f] | ||
// whitespace, replace codepoints 0 with '\ufffd' | ||
// trim non-relevant leading/trailing whitespaces | ||
selector = selector. | ||
replace(reTrimSpaces, ''). | ||
replace(/\x00|\\$/g, '\ufffd'); | ||
if (!OPERA_QSAPI && reSimpleSelector.test(selector)) { | ||
switch (selector.charAt(0)) { | ||
@@ -1485,3 +1551,3 @@ case '#': | ||
else if (!XML_DOCUMENT && Config.USE_QSAPI && | ||
!(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && | ||
!(BUGGY_QUIRKS_QSAPI && reClass.test(selector)) && | ||
!RE_BUGGY_QSAPI.test(selector)) { | ||
@@ -1500,4 +1566,2 @@ try { | ||
selector = selector.replace(reTrimSpaces, ''); | ||
Config.SHORTCUTS && (selector = Dom.shortcuts(selector, from)); | ||
@@ -1543,4 +1607,4 @@ | ||
callback && callback(element); | ||
elements = new global.Array(element); | ||
} else elements = new global.Array(); | ||
elements = [element]; | ||
} else elements = [ ]; | ||
} | ||
@@ -1554,3 +1618,3 @@ } | ||
callback && callback(element); | ||
elements = new global.Array(element); | ||
elements = [element]; | ||
} else if (/[>+~]/.test(selector)) { | ||
@@ -1561,3 +1625,3 @@ from = element.parentNode; | ||
} | ||
} else elements = new global.Array(); | ||
} else elements = [ ]; | ||
} | ||
@@ -1577,7 +1641,4 @@ | ||
if ((elements = _byClass(token, from)).length === 0) { return [ ]; } | ||
if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); | ||
} else { | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); | ||
} | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, | ||
reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); | ||
} | ||
@@ -1587,11 +1648,8 @@ | ||
if ((elements = _byClass(token, from)).length === 0) { return [ ]; } | ||
for (i = 0, els = new global.Array(); elements.length > i; ++i) { | ||
for (i = 0, els = [ ]; elements.length > i; ++i) { | ||
els = concatList(els, elements[i].getElementsByTagName('*')); | ||
} | ||
elements = els; | ||
if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); | ||
} else { | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); | ||
} | ||
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, | ||
reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); | ||
} | ||
@@ -1607,3 +1665,7 @@ | ||
if (!elements) { | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); | ||
if (IE_LT_9) { | ||
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.children : byTagRaw('*', from); | ||
} else { | ||
elements = from.getElementsByTagName('*'); | ||
} | ||
} | ||
@@ -1618,3 +1680,3 @@ // end of prefiltering pass | ||
elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, new global.Object()); | ||
elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); | ||
@@ -1632,11 +1694,11 @@ Config.CACHING && Dom.saveResults(original, from, doc, elements); | ||
// compiled match functions returning booleans | ||
matchContexts = new global.Object(), | ||
matchResolvers = new global.Object(), | ||
matchContexts = { }, | ||
matchResolvers = { }, | ||
// compiled select functions returning collections | ||
selectContexts = new global.Object(), | ||
selectResolvers = new global.Object(), | ||
selectContexts = { }, | ||
selectResolvers = { }, | ||
// used to pass methods to compiled functions | ||
Snapshot = new global.Object({ | ||
Snapshot = { | ||
@@ -1665,115 +1727,107 @@ // element indexing methods | ||
match: match | ||
}), | ||
}, | ||
Tokens = new global.Object({ | ||
prefixes: prefixes, | ||
encoding: encoding, | ||
operators: operators, | ||
whitespace: whitespace, | ||
identifier: identifier, | ||
attributes: attributes, | ||
combinators: combinators, | ||
pseudoclass: pseudoclass, | ||
pseudoparms: pseudoparms, | ||
quotedvalue: quotedvalue | ||
}); | ||
/*------------------------------- PUBLIC API -------------------------------*/ | ||
// code referenced by extensions | ||
Dom.ACCEPT_NODE = ACCEPT_NODE; | ||
Dom = { | ||
// retrieve element by id attr | ||
Dom.byId = byId; | ||
ACCEPT_NODE: ACCEPT_NODE, | ||
// retrieve elements by tag name | ||
Dom.byTag = byTag; | ||
// retrieve element by id attr | ||
byId: byId, | ||
// retrieve elements by name attr | ||
Dom.byName = byName; | ||
// retrieve elements by tag name | ||
byTag: byTag, | ||
// retrieve elements by class name | ||
Dom.byClass = byClass; | ||
// retrieve elements by name attr | ||
byName: byName, | ||
// read the value of the attribute | ||
// as was in the original HTML code | ||
Dom.getAttribute = getAttribute; | ||
// retrieve elements by class name | ||
byClass: byClass, | ||
// check for the attribute presence | ||
// as was in the original HTML code | ||
Dom.hasAttribute = hasAttribute; | ||
// read the value of the attribute | ||
// as was in the original HTML code | ||
getAttribute: getAttribute, | ||
// element match selector, return boolean true/false | ||
Dom.match = match; | ||
// check for the attribute presence | ||
// as was in the original HTML code | ||
hasAttribute: hasAttribute, | ||
// first element match only, return element or null | ||
Dom.first = first; | ||
// element match selector, return boolean true/false | ||
match: match, | ||
// elements matching selector, starting from element | ||
Dom.select = select; | ||
// first element match only, return element or null | ||
first: first, | ||
// compile selector into ad-hoc javascript resolver | ||
Dom.compile = compile; | ||
// elements matching selector, starting from element | ||
select: select, | ||
// check that two elements are ancestor/descendant | ||
Dom.contains = contains; | ||
// compile selector into ad-hoc javascript resolver | ||
compile: compile, | ||
// handle selector engine configuration settings | ||
Dom.configure = configure; | ||
// check that two elements are ancestor/descendant | ||
contains: contains, | ||
// initialize caching for each document | ||
Dom.setCache = FN; | ||
// handle selector engine configuration settings | ||
configure: configure, | ||
// load previously collected result set | ||
Dom.loadResults = FN; | ||
// initialize caching for each document | ||
setCache: FN, | ||
// save previously collected result set | ||
Dom.saveResults = FN; | ||
// load previously collected result set | ||
loadResults: FN, | ||
// handle missing context in selector strings | ||
Dom.shortcuts = FN; | ||
// save previously collected result set | ||
saveResults: FN, | ||
// log resolvers errors/warnings | ||
Dom.emit = emit; | ||
// handle missing context in selector strings | ||
shortcuts: FN, | ||
// options enabing specific engine functionality | ||
Dom.Config = Config; | ||
// log resolvers errors/warnings | ||
emit: emit, | ||
// pass methods references to compiled resolvers | ||
Dom.Snapshot = Snapshot; | ||
// options enabing specific engine functionality | ||
Config: Config, | ||
// operators descriptor | ||
// for attribute operators extensions | ||
Dom.Operators = Operators; | ||
// pass methods references to compiled resolvers | ||
Snapshot: Snapshot, | ||
// selectors descriptor | ||
// for pseudo-class selectors extensions | ||
Dom.Selectors = Selectors; | ||
// operators descriptor | ||
// for attribute operators extensions | ||
Operators: Operators, | ||
// export string patterns | ||
Dom.Tokens = Tokens; | ||
// selectors descriptor | ||
// for pseudo-class selectors extensions | ||
Selectors: Selectors, | ||
// export version string | ||
Dom.Version = version; | ||
// export validators REs | ||
Tokens: Tokens, | ||
// add or overwrite user defined operators | ||
Dom.registerOperator = | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}; | ||
// export version string | ||
Version: version, | ||
// add selector patterns for user defined callbacks | ||
Dom.registerSelector = | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = new global.Object({ | ||
Expression: rexp, | ||
Callback: func | ||
})); | ||
}; | ||
// add or overwrite user defined operators | ||
registerOperator: | ||
function(symbol, resolver) { | ||
Operators[symbol] || (Operators[symbol] = resolver); | ||
}, | ||
// add selector patterns for user defined callbacks | ||
registerSelector: | ||
function(name, rexp, func) { | ||
Selectors[name] || (Selectors[name] = { | ||
Expression: rexp, | ||
Callback: func | ||
}); | ||
} | ||
}; | ||
/*---------------------------------- INIT ----------------------------------*/ | ||
// init context specific variables | ||
switchContext(doc, true); | ||
initialize(doc); | ||
return Dom; | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
148558
3660