1
0
mirror of https://github.com/S2-/minifyfromhtml.git synced 2025-08-02 20:00:05 +02:00
This commit is contained in:
s2
2018-05-05 14:29:20 +02:00
parent 62dd054f83
commit d17c4fe70c
1809 changed files with 262593 additions and 219 deletions

22
node_modules/nwmatcher/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,22 @@
Copyright (c) 2007-2018 Diego Perini (http://www.iport.it)
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

113
node_modules/nwmatcher/README.md generated vendored Normal file
View File

@@ -0,0 +1,113 @@
# [NWMatcher](http://dperini.github.io/nwmatcher/)
A fast CSS selector engine and matcher.
## Installation
To include NWMatcher in a standard web page:
```html
<script type="text/javascript" src="nwmatcher.js"></script>
```
To use it with Node.js:
```
$ npm install nwmatcher
```
NWMatcher currently supports browsers (as a global, `NW.Dom`) and headless environments (as a CommonJS module).
## Supported Selectors
Here is a list of all the CSS2/CSS3 [Supported selectors](https://github.com/dperini/nwmatcher/wiki/CSS-supported-selectors).
## Features and Compliance
You can read more about NWMatcher [features and compliance](https://github.com/dperini/nwmatcher/wiki/Features-and-compliance) on the wiki.
## API
### DOM Selection
#### `first( selector, context )`
Returns a reference to the first element matching `selector`, starting at `context`.
#### `match( element, selector, context )`
Returns `true` if `element` matches `selector`, starting at `context`; returns `false` otherwise.
#### `select( selector, context, callback )`
Returns an array of all the elements matching `selector`, starting at `context`. If `callback` is provided, it is invoked for each matching element.
### DOM Helpers
#### `byId( id, from )`
Returns a reference to the first element with ID `id`, optionally filtered to descendants of the element `from`.
#### `byTag( tag, from )`
Returns an array of elements having the specified tag name `tag`, optionally filtered to descendants of the element `from`.
#### `byClass( class, from )`
Returns an array of elements having the specified class name `class`, optionally filtered to descendants of the element `from`.
#### `byName( name, from )`
Returns an array of elements having the specified value `name` for their name attribute, optionally filtered to descendants of the element `from`.
#### `getAttribute( element, attribute )`
Return the value read from the attribute of `element` with name `attribute`, as a string.
#### `hasAttribute( element, attribute )`
Returns true `element` has an attribute with name `attribute` set; returns `false` otherwise.
### Engine Configuration
#### `configure( options )`
The following is the list of currently available configuration options, their default values and descriptions, they are boolean flags that can be set to `true` or `false`:
* `CACHING`: false - false to disable caching of result sets, true to enable
* `ESCAPECHR`: true - true to allow CSS escaped identifiers, false to disallow
* `NON_ASCII`: true - true to allow identifiers containing non-ASCII (utf-8) chars
* `SELECTOR3`: true - switch syntax RE, true to use Level 3, false to use Level 2
* `UNICODE16`: true - true to allow identifiers containing Unicode (utf-16) chars
* `SHORTCUTS`: false - false to disable mangled selector strings like "+div" or "ul>"
* `SIMPLENOT`: true - true to disallow complex selectors nested in ':not()' classes
* `SVG_LCASE`: false - false to disable matching lowercase tag names of SVG elements
* `UNIQUE_ID`: true - true to disallow multiple elements with the same id (strict)
* `USE_HTML5`: true - true to use HTML5 specs for ":checked" and similar UI states
* `USE_QSAPI`: true - true to use browsers native Query Selector API if available
* `VERBOSITY`: true - true to throw exceptions, false to skip throwing exceptions
* `LOGERRORS`: true - true to print console errors or warnings, false to mute them
Example:
```js
NW.Dom.configure( { USE_QSAPI: false, VERBOSITY: false } );
```
#### `registerOperator( symbol, resolver )`
Registers a new symbol and its matching resolver in the operators table. Example:
```js
NW.Dom.registerOperator( '!=', 'n!="%m"' );
```
#### `registerSelector( name, rexp, func )`
Registers a new selector, with the matching regular expression and the appropriate resolver function, in the selectors table.

59
node_modules/nwmatcher/package.json generated vendored Normal file
View File

@@ -0,0 +1,59 @@
{
"_from": "nwmatcher@^1.4.3",
"_id": "nwmatcher@1.4.4",
"_inBundle": false,
"_integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
"_location": "/nwmatcher",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "nwmatcher@^1.4.3",
"name": "nwmatcher",
"escapedName": "nwmatcher",
"rawSpec": "^1.4.3",
"saveSpec": null,
"fetchSpec": "^1.4.3"
},
"_requiredBy": [
"/jsdom"
],
"_resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
"_shasum": "2285631f34a95f0d0395cd900c96ed39b58f346e",
"_spec": "nwmatcher@^1.4.3",
"_where": "/home/s2/Documents/Code/minifyfromhtml/node_modules/jsdom",
"author": {
"name": "Diego Perini",
"email": "diego.perini@gmail.com",
"url": "http://www.iport.it/"
},
"bugs": {
"url": "http://github.com/dperini/nwmatcher/issues"
},
"bundleDependencies": false,
"deprecated": false,
"description": "A CSS3-compliant JavaScript selector engine.",
"ender": "./lib/ender/bridge.js",
"homepage": "http://javascript.nwbox.com/NWMatcher/",
"keywords": [
"css",
"matcher",
"selector",
"ender"
],
"license": "MIT",
"main": "./src/nwmatcher",
"maintainers": [
{
"name": "Diego Perini",
"email": "diego.perini@gmail.com",
"url": "http://www.iport.it/"
}
],
"name": "nwmatcher",
"repository": {
"type": "git",
"url": "git://github.com/dperini/nwmatcher.git"
},
"version": "1.4.4"
}

187
node_modules/nwmatcher/src/modules/nwmatcher-cache.js generated vendored Normal file
View File

@@ -0,0 +1,187 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* Caching/memoization module for NWMatcher
*
* Added capabilities:
*
* - Mutation Events are feature tested and used safely
* - handle caching different document types HTML/XML/SVG
* - store result sets for different selectors / contexts
* - simultaneously control mutation on multiple documents
*
*/
(function(global) {
// export the public API for CommonJS implementations,
// for headless JS engines or for standard web browsers
var Dom =
// as CommonJS/NodeJS module
typeof exports == 'object' ? exports :
// create or extend NW namespace
((global.NW || (global.NW = { })) &&
(global.NW.Dom || (global.NW.Dom = { }))),
Contexts = { },
Results = { },
isEnabled = false,
isExpired = true,
isPaused = false,
context = global.document,
root = context.documentElement,
// timing pauses
now = 0,
// last time cache initialization was called
lastCalled = 0,
// minimum time allowed between calls to the cache initialization
minCacheRest = 15, //ms
mutationTest =
function(type, callback) {
var isSupported = false,
root = document.documentElement,
div = document.createElement('div'),
handler = function() { isSupported = true; };
root.insertBefore(div, root.firstChild);
div.addEventListener(type, handler, true);
if (callback && callback.call) callback(div);
div.removeEventListener(type, handler, true);
root.removeChild(div);
return isSupported;
},
// check for Mutation Events, DOMAttrModified should be
// enough to ensure DOMNodeInserted/DOMNodeRemoved exist
HACKED_MUTATION_EVENTS = false,
NATIVE_MUTATION_EVENTS = root.addEventListener ?
mutationTest('DOMAttrModified', function(e) { e.setAttribute('id', 'nw'); }) : false,
loadResults =
function(selector, from, doc, root) {
if (isEnabled && !isPaused) {
if (!isExpired) {
if (Results[selector] && Contexts[selector] === from) {
return Results[selector];
}
} else {
// pause caching while we are getting
// hammered by dom mutations (jdalton)
now = (new Date).getTime();
if ((now - lastCalled) < minCacheRest) {
isPaused = isExpired = true;
setTimeout(function() { isPaused = false; }, minCacheRest);
} else setCache(true, doc);
lastCalled = now;
}
}
return undefined;
},
saveResults =
function(selector, from, doc, data) {
Contexts[selector] = from;
Results[selector] = data;
return;
},
/*-------------------------------- CACHING ---------------------------------*/
// invoked by mutation events to expire cached parts
mutationWrapper =
function(event) {
var d = event.target.ownerDocument || event.target;
stopMutation(d);
expireCache(d);
},
// append mutation events
startMutation =
function(d) {
if (!d.isCaching && d.addEventListener) {
// FireFox/Opera/Safari/KHTML have support for Mutation Events
d.addEventListener('DOMAttrModified', mutationWrapper, true);
d.addEventListener('DOMNodeInserted', mutationWrapper, true);
d.addEventListener('DOMNodeRemoved', mutationWrapper, true);
d.isCaching = true;
}
},
// remove mutation events
stopMutation =
function(d) {
if (d.isCaching && d.removeEventListener) {
d.removeEventListener('DOMAttrModified', mutationWrapper, true);
d.removeEventListener('DOMNodeInserted', mutationWrapper, true);
d.removeEventListener('DOMNodeRemoved', mutationWrapper, true);
d.isCaching = false;
}
},
// enable/disable context caching system
// @d optional document context (iframe, xml document)
// script loading context will be used as default context
setCache =
function(enable, d) {
if (!!enable) {
isExpired = false;
startMutation(d);
} else {
isExpired = true;
stopMutation(d);
}
isEnabled = !!enable;
},
// expire complete cache
// can be invoked by Mutation Events or
// programmatically by other code/scripts
// document context is mandatory no checks
expireCache =
function(d) {
isExpired = true;
Contexts = { };
Results = { };
};
if (!NATIVE_MUTATION_EVENTS && root.addEventListener && Element && Element.prototype) {
if (mutationTest('DOMNodeInserted', function(e) { e.appendChild(document.createElement('div')); }) &&
mutationTest('DOMNodeRemoved', function(e) { e.removeChild(e.appendChild(document.createElement('div'))); })) {
HACKED_MUTATION_EVENTS = true;
Element.prototype._setAttribute = Element.prototype.setAttribute;
Element.prototype.setAttribute =
function(name, val) {
this._setAttribute(name, val);
mutationWrapper({
target: this,
type: 'DOMAttrModified',
attrName: name,
attrValue: val });
};
}
}
isEnabled = NATIVE_MUTATION_EVENTS || HACKED_MUTATION_EVENTS;
/*------------------------------- PUBLIC API -------------------------------*/
// save results into cache
Dom.saveResults = saveResults;
// load results from cache
Dom.loadResults = loadResults;
// expire DOM tree cache
Dom.expireCache = expireCache;
// enable/disable cache
Dom.setCache = setCache;
})(this);

126
node_modules/nwmatcher/src/modules/nwmatcher-jquery.js generated vendored Normal file
View File

@@ -0,0 +1,126 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* this is just a small example to show
* how an extension for NWMatcher could be
* adapted to handle special jQuery selectors
*
* Child Selectors
* :even, :odd, :eq, :lt, :gt, :first, :last, :nth
*
* Pseudo Selectors
* :has, :button, :header, :input, :checkbox, :radio, :file, :image
* :password, :reset, :submit, :text, :hidden, :visible, :parent
*
*/
// for structural pseudo-classes extensions
NW.Dom.registerSelector(
'jquery:child',
/^\:((?:(nth|eq|lt|gt)\(([^()]*)\))|(?:even|odd|first|last))(.*)/i,
(function(global) {
return function(match, source, selector) {
var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE;
switch (match[1].toLowerCase()) {
case 'odd':
source = source.replace(ACCEPT_NODE, 'if((x=x^1)==0){' + ACCEPT_NODE + '}');
break;
case 'even':
source = source.replace(ACCEPT_NODE, 'if((x=x^1)==1){' + ACCEPT_NODE + '}');
break;
case 'first':
source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[0]===e){' + source + '}';
break;
case 'last':
source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[n.length-1]===e){' + source + '}';
break;
default:
switch (match[2].toLowerCase()) {
case 'nth':
source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[' + match[3] + ']===e){' + source + '}';
break;
case 'eq':
source = source.replace(ACCEPT_NODE, 'if(x++==' + match[3] + '){' + ACCEPT_NODE + '}');
break;
case 'lt':
source = source.replace(ACCEPT_NODE, 'if(x++<' + match[3] + '){' + ACCEPT_NODE + '}');
break;
case 'gt':
source = source.replace(ACCEPT_NODE, 'if(x++>' + match[3] + '){' + ACCEPT_NODE + '}');
break;
default:
status = false;
break;
}
break;
}
// compiler will add this to "source"
return {
'source': source,
'status': status
};
};
})(this));
// for element pseudo-classes extensions
NW.Dom.registerSelector(
'jquery:pseudo',
/^\:(has|checkbox|file|image|password|radio|reset|submit|text|button|input|header|hidden|visible|parent)(?:\(\s*(["']*)?([^'"()]*)\2\s*\))?(.*)/i,
(function(global) {
return function(match, source) {
var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE;
switch(match[1].toLowerCase()) {
case 'has':
source = source.replace(ACCEPT_NODE, 'if(e.getElementsByTagName("' + match[3].replace(/^\s|\s$/g, '') + '")[0]){' + ACCEPT_NODE + '}');
break;
case 'checkbox':
case 'file':
case 'image':
case 'password':
case 'radio':
case 'reset':
case 'submit':
case 'text':
// :checkbox, :file, :image, :password, :radio, :reset, :submit, :text
source = 'if(/^' + match[1] + '$/i.test(e.type)){' + source + '}';
break;
case 'button':
case 'input':
source = 'if(e.type||/button/i.test(e.nodeName)){' + source + '}';
break;
case 'header':
source = 'if(/h[1-6]/i.test(e.nodeName)){' + source + '}';
break;
case 'hidden':
source = 'if(!e.offsetWidth&&!e.offsetHeight){' + source + '}';
break;
case 'visible':
source = 'if(e.offsetWidth||e.offsetHeight){' + source + '}';
break;
case 'parent':
source += 'if(e.firstChild){' + source + '}';
break;
default:
status = false;
break;
}
// compiler will add this to "source"
return {
'source': source,
'status': status
};
};
})(this));

308
node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js generated vendored Normal file
View File

@@ -0,0 +1,308 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* CSS3 pseudo-classes extension for NWMatcher
*
* Added capabilities:
*
* - structural pseudo-classes
*
* :root, :empty,
* :nth-child(), nth-of-type(),
* :nth-last-child(), nth-last-of-type(),
* :first-child, :last-child, :only-child
* :first-of-type, :last-of-type, :only-of-type
*
* - negation, language, target and UI element pseudo-classes
*
* :not(), :target, :lang(), :target
* :link, :visited, :active, :focus, :hover,
* :checked, :disabled, :enabled, :selected
*/
(function(global) {
var LINK_NODES = {
'a': 1, 'A': 1,
'area': 1, 'AREA': 1,
'link': 1, 'LINK': 1
},
root = document.documentElement,
contains = 'compareDocumentPosition' in root ?
function(container, element) {
return (container.compareDocumentPosition(element) & 16) == 16;
} : 'contains' in root ?
function(container, element) {
return element.nodeType == 1 && container.contains(element);
} :
function(container, element) {
while ((element = element.parentNode) && element.nodeType == 1) {
if (element === container) return true;
}
return false;
},
isLink =
function(element) {
return element.getAttribute('href') && LINK_NODES[element.nodeName];
},
isEmpty =
function(node) {
node = node.firstChild;
while (node) {
if (node.nodeType == 3 || node.nodeName > '@') return false;
node = node.nextSibling;
}
return true;
},
nthElement =
function(element, last) {
var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
while ((element = element[succ])) {
if (element.nodeName > '@') ++count;
}
return count;
},
nthOfType =
function(element, last) {
var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
while ((element = element[succ])) {
if (element.nodeName == type) ++count;
}
return count;
};
NW.Dom.Snapshot['contains'] = contains;
NW.Dom.Snapshot['isLink'] = isLink;
NW.Dom.Snapshot['isEmpty'] = isEmpty;
NW.Dom.Snapshot['nthOfType'] = nthOfType;
NW.Dom.Snapshot['nthElement'] = nthElement;
})(this);
NW.Dom.registerSelector(
'nwmatcher: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,
(function(global) {
return function(match, source) {
var a, n, b, status = true, test, type;
switch (match[1]) {
case 'root':
if (match[3])
source = 'if(e===h||s.contains(h,e)){' + source + '}';
else
source = 'if(e===h){' + source + '}';
break;
case 'empty':
source = 'if(s.isEmpty(e)){' + source + '}';
break;
default:
if (match[1] && match[2]) {
if (match[2] == 'n') {
source = 'if(e!==h){' + source + '}';
break;
} else if (match[2] == 'even') {
a = 2;
b = 0;
} else if (match[2] == 'odd') {
a = 2;
b = 1;
} else {
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;
}
test = a > 1 ?
(/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
(/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a === 0 ?
'n==' + b : a == -1 ? 'n<=' + b : 'n>=' + b;
source =
'if(e!==h){' +
'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
'(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
'if(' + test + '){' + source + '}' +
'}';
} else if (match[1]) {
a = /first/i.test(match[1]) ? 'previous' : 'next';
n = /only/i.test(match[1]) ? 'previous' : 'next';
b = /first|last/i.test(match[1]);
type = /-of-type/i.test(match[1]) ? '&&n.nodeName!==e.nodeName' : '&&n.nodeName<"@"';
source = 'if(e!==h){' +
( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
} else {
status = false;
}
break;
}
return {
'source': source,
'status': status
};
};
})(this));
NW.Dom.registerSelector(
'nwmatcher: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,
(function(global) {
var doc = global.document,
Config = NW.Dom.Config,
Tokens = NW.Dom.Tokens,
reTrimSpace = RegExp('^\\s+|\\s+$', 'g'),
reSimpleNot = RegExp('^((?!:not)' +
'(' + Tokens.prefixes + '|' + Tokens.identifier +
'|\\([^()]*\\))+|\\[' + Tokens.attributes + '\\])$');
return function(match, source) {
var expr, status = true, test;
switch (match[1].match(/^\w+/)[0]) {
case 'not':
expr = match[3].replace(reTrimSpace, '');
if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
NW.Dom.emit('Negation pseudo-class only accepts simple selectors "' + selector + '"');
} else {
if ('compatMode' in doc) {
source = 'if(!' + NW.Dom.compile(expr, '', false) + '(e,s,d,h,g)){' + source + '}';
} else {
source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
}
}
break;
case 'checked':
source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
(Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
'){' + source + '}';
break;
case 'disabled':
source = 'if(((typeof e.form!=="undefined"' +
(Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
')||s.isLink(e))&&e.disabled===true){' + source + '}';
break;
case 'enabled':
source = 'if(((typeof e.form!=="undefined"' +
(Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
')||s.isLink(e))&&e.disabled===false){' + source + '}';
break;
case 'lang':
test = '';
if (match[2]) test = match[2].substr(0, 2) + '-';
source = 'do{(n=e.lang||"").toLowerCase();' +
'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
'(n&&(n=="' + match[2].toLowerCase() +
'"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
'{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
break;
case 'target':
source = 'if(e.id==d.location.hash.slice(1)){' + source + '}';
break;
case 'link':
source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
break;
case 'visited':
source = 'if(s.isLink(e)&&e.visited){' + source + '}';
break;
case 'active':
source = 'if(e===d.activeElement){' + source + '}';
break;
case 'hover':
source = 'if(e===d.hoverElement){' + source + '}';
break;
case 'focus':
source = 'hasFocus' in doc ?
'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||typeof e.tabIndex=="number")){' + source + '}' :
'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
break;
case 'selected':
source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}';
break;
default:
status = false;
break;
}
return {
'source': source,
'status': status
};
};
})(this));
NW.Dom.registerSelector(
'nwmatcher:epseudos',
/^((?:[:]{1,2}(?:after|before|first-letter|first-line))|(?:[:]{2,2}(?:selection|backdrop|placeholder)))?(.*)/i,
(function(global) {
return function(match, source) {
var status = true;
switch (match[1].match(/(\w+)$/)[0]) {
case 'after':
case 'before':
case 'first-letter':
case 'first-line':
case 'selection':
case 'backdrop':
case 'placeholder':
source = 'if(!(/1|11/).test(e.nodeType)){' + source + '}';
break;
default:
status = false;
break;
}
return {
'source': source,
'status': status
};
};
})(this));

View File

@@ -0,0 +1,35 @@
NW.Dom.shortcuts = (function() {
// match missing R/L context
var nextID = 0,
reLeftContext = /^[\x20\t\n\r\f]*[>+~]/,
reRightContext = /[>+~][\x20\t\n\r\f]*$/;
return function(selector, from, alt) {
// add left context if missing
if (reLeftContext.test(selector)) {
if (from.nodeType == 9) {
selector = '* ' + selector;
} else if (/html|body/i.test(from.nodeName)) {
selector = from.nodeName + ' ' + selector;
} else if (alt) {
selector = NW.Dom.shortcuts(selector, alt);
} else if (from.nodeType == 1 && from.id) {
selector = '#' + from.id + ' ' + selector;
} else {
++nextID;
selector = '#' + (from.id = 'NW' + nextID) + ' ' + selector;
//NW.Dom.emit('Unable to resolve a context for the shortcut selector "' + selector + '"');
}
}
// add right context if missing
if (reRightContext.test(selector)) {
selector += ' *';
}
return selector;
};
})();

View File

@@ -0,0 +1,90 @@
/*
* Element Traversal methods from Juriy Zaytsev (kangax)
* used to emulate Prototype up/down/previous/next methods
*/
(function(D){
// TODO: all of this needs tests
var match = D.match, select = D.select, root = document.documentElement,
// Use the Element Traversal API if available.
nextElement = 'nextElementSibling',
previousElement = 'previousElementSibling',
parentElement = 'parentElement';
// Fall back to the DOM Level 1 API.
if (!(nextElement in root)) nextElement = 'nextSibling';
if (!(previousElement in root)) previousElement = 'previousSibling';
if (!(parentElement in root)) parentElement = 'parentNode';
function walkElements(property, element, expr) {
var i = 0, isIndex = typeof expr == 'number';
if (typeof expr == 'undefined') {
isIndex = true;
expr = 0;
}
while ((element = element[property])) {
if (element.nodeType != 1) continue;
if (isIndex) {
++i;
if (i == expr) return element;
} else if (match(element, expr)) {
return element;
}
}
return null;
}
/**
* @method up
* @param {HTMLElement} element element to walk from
* @param {String | Number} expr CSS expression or an index
* @return {HTMLElement | null}
*/
function up(element, expr) {
return walkElements(parentElement, element, expr);
}
/**
* @method next
* @param {HTMLElement} element element to walk from
* @param {String | Number} expr CSS expression or an index
* @return {HTMLElement | null}
*/
function next(element, expr) {
return walkElements(nextElement, element, expr);
}
/**
* @method previous
* @param {HTMLElement} element element to walk from
* @param {String | Number} expr CSS expression or an index
* @return {HTMLElement | null}
*/
function previous(element, expr) {
return walkElements(previousElement, element, expr);
}
/**
* @method down
* @param {HTMLElement} element element to walk from
* @param {String | Number} expr CSS expression or an index
* @return {HTMLElement | null}
*/
function down(element, expr) {
var isIndex = typeof expr == 'number', descendants, index, descendant;
if (expr === null) {
element = element.firstChild;
while (element && element.nodeType != 1) element = element[nextElement];
return element;
}
if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;
descendants = select('*', element);
if (isIndex) return descendants[expr] || null;
index = 0;
while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }
return descendant || null;
}
D.up = up;
D.down = down;
D.next = next;
D.previous = previous;
})(NW.Dom);

View File

@@ -0,0 +1,104 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* this is just a small example to show
* how an extension for NWMatcher could be
* adapted to handle WebForms/HTML5 selectors
*
* Pseudo Selectors
* :default, :indeterminate, :optional, :required,
* :valid, :invalid, :in-range, :out-of-range,
* :read-only, :read-write
* :has, :matches (not yet in a defined specification)
*
*/
// for UI pseudo-classes extensions (WebForms/HTML5)
NW.Dom.registerSelector(
'html5:pseudos',
/^\:(default|indeterminate|optional|required|valid|invalid|in-range|out-of-range|read-only|read-write)(.*)/,
(function(global) {
return function(match, source) {
var status = true,
HTML5PseudoClasses = {
'default': 4, 'indeterminate': 4, 'invalid': 4, 'valid': 4,
'optional': 4, 'required': 4, 'read-write': 4, 'read-only': 4
};
switch (match[1]) {
// HTML5 UI element states (form controls)
case 'default':
// only radio buttons, check boxes and option elements
source = 'if(((typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type))||/option/i.test(e.nodeName))&&(e.defaultChecked||e.defaultSelected)){' + source + '}';
break;
case 'indeterminate':
// only radio buttons, check boxes and option elements
source = 'if(typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type)&&s.select("[checked]",e.form).length===0){' + source + '}';
break;
case 'optional':
// only fields for which "required" applies
source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&!e.required){' + source + '}';
break;
case 'required':
// only fields for which "required" applies
source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&e.required){' + source + '}';
break;
case 'read-write':
// only fields for which "readOnly" applies
source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&!e.readOnly){' + source + '}';
break;
case 'read-only':
// only fields for which "readOnly" applies
source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&e.readOnly){' + source + '}';
break;
case 'invalid':
// only fields for which validity applies
source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&!e.validity.valid){' + source + '}';
break;
case 'valid':
// only fields for which validity applies
source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&e.validity.valid){' + source + '}';
break;
case 'in-range':
// only fields for which validity applies
source = 'if(typeof e.form!=="undefined"&&' +
'(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' +
'typeof e.validity=="object"&&!e.validity.typeMismatch&&' +
'!e.validity.rangeUnderflow&&!e.validity.rangeOverflow){' + source + '}';
break;
case 'out-of-range':
// only fields for which validity applies
source = 'if(typeof e.form!=="undefined"&&' +
'(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' +
'typeof e.validity=="object"&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)){' + source + '}';
break;
default:
status = false;
break;
}
// compiler will add this to "source"
return {
'source': source,
'status': status
};
};
})(this));

794
node_modules/nwmatcher/src/nwmatcher-base.js generated vendored Normal file
View File

@@ -0,0 +1,794 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* nwmatcher-base.js - A fast CSS selector engine and matcher
*
* Author: Diego Perini <diego.perini at gmail com>
* Version: 1.4.4
* Created: 20070722
* Release: 20180305
*
* License:
* http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
* Download:
* http://javascript.nwbox.com/NWMatcher/nwmatcher.js
*/
(function(global, factory) {
if (typeof module == 'object' && typeof exports == 'object') {
module.exports = factory;
} else if (typeof define === 'function' && define["amd"]) {
define(factory);
} else {
global.NW || (global.NW = { });
global.NW.Dom = factory(global);
}
})(this, function(global) {
var version = 'nwmatcher-1.4.4',
doc = global.document,
root = doc.documentElement,
isSingleMatch,
isSingleSelect,
lastSlice,
lastContext,
lastPosition,
lastMatcher,
lastSelector,
lastPartsMatch,
lastPartsSelect,
prefixes = '(?:[#.:]|::)?',
operators = '([~*^$|!]?={1})',
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 = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'",
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g,
reTrimSpaces = RegExp('[\\n\\r\\f]|^' + whitespace + '+|' + whitespace + '+$', 'g'),
reEscapedChars = /\\([0-9a-fA-F]{1,6}[\x20\t\n\r\f]?|.)|([\x22\x27])/g,
standardValidator, extendedValidator, reValidator,
attrcheck, attributes, attrmatcher, pseudoclass,
reOptimizeSelector, reSimpleNot, reSplitToken,
Optimize, identifier, extensions = '.+',
Patterns = {
children: RegExp('^' + whitespace + '*\\>' + whitespace + '*(.*)'),
adjacent: RegExp('^' + whitespace + '*\\+' + whitespace + '*(.*)'),
relative: RegExp('^' + whitespace + '*\\~' + whitespace + '*(.*)'),
ancestor: RegExp('^' + whitespace + '+(.*)'),
universal: RegExp('^\\*(.*)')
},
Tokens = {
prefixes: prefixes,
identifier: identifier,
attributes: attributes
},
QUIRKS_MODE,
XML_DOCUMENT,
GEBTN = 'getElementsByTagName' in doc,
GEBCN = 'getElementsByClassName' in doc,
IE_LT_9 = typeof doc.addEventListener != 'function',
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 = {
value: 'defaultValue',
checked: 'defaultChecked',
selected: 'defaultSelected'
},
ATTR_URIDATA = {
action: 2, cite: 2, codebase: 2, data: 2, href: 2,
longdesc: 2, lowsrc: 2, src: 2, usemap: 2
},
HTML_TABLE = {
'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1,
'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1,
'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1,
'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1,
'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1,
'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1,
'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1,
'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1
},
NATIVE_TRAVERSAL_API =
'nextElementSibling' in root &&
'previousElementSibling' in root,
Selectors = { },
Operators = {
'=': "n=='%m'",
'^=': "n.indexOf('%m')==0",
'*=': "n.indexOf('%m')>-1",
'|=': "(n+'-').indexOf('%m-')==0",
'~=': "(' '+n+' ').indexOf(' %m ')>-1",
'$=': "n.substr(n.length-'%m'.length)=='%m'"
},
concatCall =
function(data, elements, callback) {
var i = -1, element;
while ((element = elements[++i])) {
if (false === callback(data[data.length] = element)) { break; }
}
return data;
},
switchContext =
function(from, force) {
var oldDoc = doc;
lastContext = from;
doc = from.ownerDocument || from;
if (force || oldDoc !== doc) {
root = doc.documentElement;
XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
QUIRKS_MODE = !XML_DOCUMENT &&
typeof doc.compatMode == 'string' ?
doc.compatMode.indexOf('CSS') < 0 :
(function() {
var style = doc.createElement('div').style;
return style && (style.width = 1) && style.width == '1px';
})();
Config.CACHING && Dom.setCache(true, doc);
}
},
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(reEscapedChars,
function(substring, p1, p2) {
return p2 ? '\\' + p2 :
(/^[0-9a-fA-F]/).test(p1) ? codePointToUTF16(parseInt(p1, 16)) :
(/^[\\\x22\x27]/).test(p1) ? substring :
p1;
}
);
},
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;
}
);
},
byIdRaw =
function(id, elements) {
var i = -1, element;
while ((element = elements[++i])) {
if (element.getAttribute('id') == id) {
break;
}
}
return element || null;
},
_byId = !IE_LT_9 ?
function(id, from) {
id = (/\\/).test(id) ? unescapeIdentifier(id) : id;
return from.getElementById && from.getElementById(id) ||
byIdRaw(id, from.getElementsByTagName('*'));
} :
function(id, from) {
var element = null;
id = (/\\/).test(id) ? unescapeIdentifier(id) : id;
if (XML_DOCUMENT || from.nodeType != 9) {
return byIdRaw(id, from.getElementsByTagName('*'));
}
if ((element = from.getElementById(id)) &&
element.name == id && from.getElementsByName) {
return byIdRaw(id, from.getElementsByName(id));
}
return element;
},
byId =
function(id, from) {
from || (from = doc);
if (lastContext !== from) { switchContext(from); }
return _byId(id, from);
},
byTagRaw =
function(tag, from) {
var any = tag == '*', element = from, elements = [ ], next = element.firstChild;
any || (tag = tag.toUpperCase());
while ((element = next)) {
if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) {
elements[elements.length] = element;
}
if ((next = element.firstChild || element.nextSibling)) continue;
while (!next && (element = element.parentNode) && element !== from) {
next = element.nextSibling;
}
}
return elements;
},
getAttribute = !IE_LT_9 ?
function(node, attribute) {
return node.getAttribute(attribute);
} :
function(node, attribute) {
attribute = attribute.toLowerCase();
if (typeof node[attribute] == 'object') {
return node.attributes[attribute] &&
node.attributes[attribute].value;
}
return (
attribute == 'type' ? node.getAttribute(attribute) :
ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) :
ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
(node = node.getAttributeNode(attribute)) && node.value);
},
hasAttribute = !IE_LT_9 && root.hasAttribute ?
function(node, attribute) {
return node.hasAttribute(attribute);
} :
function(node, attribute) {
var obj = node.getAttributeNode(attribute = attribute.toLowerCase());
return ATTR_DEFAULT[attribute] && attribute != 'value' ?
node[ATTR_DEFAULT[attribute]] : obj && obj.specified;
},
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 (Config.LOGERRORS && console && console.log) {
console.log(message);
}
},
Config = {
CACHING: false,
ESCAPECHR: true,
NON_ASCII: true,
SELECTOR3: true,
UNICODE16: true,
SHORTCUTS: false,
SIMPLENOT: true,
SVG_LCASE: false,
UNIQUE_ID: true,
USE_HTML5: true,
VERBOSITY: true,
LOGERRORS: 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 + '*' + '(i)?' + 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 =
function(selector, source, mode) {
var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;
typeof source == 'string' || (source = '');
if (parts.length == 1) {
source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
} else {
var i = -1, seen = { }, token;
while ((token = parts[++i])) {
token = token.replace(reTrimSpaces, '');
if (!seen[token] && (seen[token] = true)) {
source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
}
}
}
if (mode) {
return Function('c,s,d,h,g,f',
'var N,n,x=0,k=-1,e,r=[];main:while((e=c[++k])){' + source + '}return r;');
} else {
return Function('e,s,d,h,g,f',
'var N,n,x=0,k=e;' + source + 'return false;');
}
},
compileSelector =
function(selector, source, mode) {
var k = 0, expr, match, result, status, test, type;
while (selector) {
k++;
if ((match = selector.match(Patterns.universal))) {
expr = '';
}
else if ((match = selector.match(Patterns.id))) {
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1];
source = 'if(' + (XML_DOCUMENT ?
's.getAttribute(e,"id")' :
'(e.submit?s.getAttribute(e,"id"):e.id)') +
'=="' + match[1] + '"' +
'){' + source + '}';
}
else if ((match = selector.match(Patterns.tagName))) {
test = Config.SVG_LCASE ? '||e.nodeName=="' + match[1].toLowerCase() + '"' : '';
source = 'if(e.nodeName' + (XML_DOCUMENT ?
'=="' + match[1] + '"' : TO_UPPER_CASE +
'=="' + match[1].toUpperCase() + '"' + test) +
'){' + source + '}';
}
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(/' + whitespace + '+/g," ")+" ").indexOf(" ' + match[1] + ' ")>-1' +
'){' + source + '}';
}
else if ((match = selector.match(Patterns.attribute))) {
expr = match[1].split(':');
expr = expr.length == 2 ? expr[1] : expr[0] + '';
if (match[2] && !Operators[match[2]]) {
emit('Unsupported operator in attribute selectors "' + selector + '"');
return '';
}
test = 'false';
if (match[2] && match[4] && (test = Operators[match[2]])) {
match[4] = (/\\/).test(match[4]) ? convertEscapes(match[4]) : match[4];
type = match[5] == 'i' || HTML_TABLE[expr.toLowerCase()];
test = test.replace(/\%m/g, type ? match[4].toLowerCase() : match[4]);
} else if (match[2] == '!=' || match[2] == '=') {
test = 'n' + match[2] + '=""';
}
source = 'if(n=s.hasAttribute(e,"' + match[1] + '")){' +
(match[2] ? 'n=s.getAttribute(e,"' + match[1] + '")' : '') +
(type && match[2] ? '.toLowerCase();' : ';') +
'if(' + (match[2] ? test : 'n') + '){' + source + '}}';
}
else if ((match = selector.match(Patterns.adjacent))) {
source = NATIVE_TRAVERSAL_API ?
'var N' + k + '=e;if((e=e.previousElementSibling)){' + source + '}e=N' + k + ';' :
'var N' + k + '=e;while((e=e.previousSibling)){if(e.nodeType==1){' + source + 'break;}}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.relative))) {
source = NATIVE_TRAVERSAL_API ?
'var N' + k + '=e;while((e=e.previousElementSibling)){' + source + '}e=N' + k + ';' :
'var N' + k + '=e;while((e=e.previousSibling)){if(e.nodeType==1){' + source + '}}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.children))) {
source = 'var N' + k + '=e;if((e=e.parentNode)&&e.nodeType==1){' + source + '}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.ancestor))) {
source = 'var N' + k + '=e;while((e=e.parentNode)&&e.nodeType==1){' + source + '}e=N' + k + ';';
}
else {
expr = false;
status = false;
for (expr in Selectors) {
if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
result = Selectors[expr].Callback(match, source);
if ('match' in result) { match = result.match; }
source = result.source;
status = result.status;
if (status) { break; }
}
}
if (!status) {
emit('Unknown pseudo-class selector "' + selector + '"');
return '';
}
if (!expr) {
emit('Unknown token in selector "' + selector + '"');
return '';
}
}
if (!match) {
emit('Invalid syntax in selector "' + selector + '"');
return '';
}
selector = match && match[match.length - 1];
}
return source;
},
match =
function(element, selector, from, callback) {
var parts;
if (!(element && element.nodeType == 1)) {
emit('Invalid element argument');
return false;
} else if (typeof selector != 'string') {
emit('Invalid selector argument');
return false;
} else if (lastContext !== from) {
switchContext(from || (from = element.ownerDocument));
}
selector = selector.
replace(reTrimSpaces, '').
replace(/\x00|\\$/g, '\ufffd');
Config.SHORTCUTS && (selector = Dom.shortcuts(selector, element, from));
if (lastMatcher != selector) {
if ((parts = selector.match(reValidator)) && parts[0] == selector) {
isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
lastMatcher = selector;
lastPartsMatch = parts;
} else {
emit('The string "' + selector + '", is not a valid CSS selector');
return false;
}
} else parts = lastPartsMatch;
if (!matchResolvers[selector] || matchContexts[selector] !== from) {
matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
matchContexts[selector] = from;
}
return matchResolvers[selector](element, Snapshot, doc, root, from, callback);
},
first =
function(selector, from) {
return select(selector, from, function() { return false; })[0] || null;
},
select =
function(selector, from, callback) {
var i, changed, element, elements, parts, token, original = selector;
if (arguments.length === 0) {
emit('Not enough arguments');
return [ ];
} else if (typeof selector != 'string') {
return [ ];
} else if (from && !(/1|9|11/).test(from.nodeType)) {
emit('Invalid or illegal context element');
return [ ];
} else if (lastContext !== from) {
switchContext(from || (from = doc));
}
if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
return callback ? concatCall([ ], elements, callback) : elements;
}
selector = selector.
replace(reTrimSpaces, '').
replace(/\x00|\\$/g, '\ufffd');
Config.SHORTCUTS && (selector = Dom.shortcuts(selector, from));
if ((changed = lastSelector != selector)) {
if ((parts = selector.match(reValidator)) && parts[0] == selector) {
isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
lastSelector = selector;
lastPartsSelect = parts;
} else {
emit('The string "' + selector + '", is not a valid CSS selector');
return [ ];
}
} else parts = lastPartsSelect;
if (from.nodeType == 11) {
elements = byTagRaw('*', from);
} else if (isSingleSelect) {
if (changed) {
parts = selector.match(reSplitToken);
token = parts[parts.length - 1];
lastSlice = token.split(':not');
lastSlice = lastSlice[lastSlice.length - 1];
lastPosition = selector.length - token.length;
}
if (Config.UNIQUE_ID && lastSlice && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
if ((element = _byId(token, from))) {
if (match(element, selector)) {
callback && callback(element);
elements = [element];
} else elements = [ ];
}
}
else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
if ((element = _byId(token, doc))) {
if ('#' + token == selector) {
callback && callback(element);
elements = [element];
} else if (/[>+~]/.test(selector)) {
from = element.parentNode;
} else {
from = element;
}
} else elements = [ ];
}
if (elements) {
Config.CACHING && Dom.saveResults(original, from, doc, elements);
return elements;
}
if (!XML_DOCUMENT && GEBTN && lastSlice && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
if ((elements = from.getElementsByTagName(token)).length === 0) { return [ ]; }
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
}
else if (!XML_DOCUMENT && GEBCN && lastSlice && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
if ((elements = from.getElementsByClassName(unescapeIdentifier(token))).length === 0) { return [ ]; }
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token,
reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*');
}
}
if (!elements) {
if (IE_LT_9) {
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.children : byTagRaw('*', from);
} else {
elements = from.getElementsByTagName('*');
}
}
if (!selectResolvers[selector] || selectContexts[selector] !== from) {
selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true);
selectContexts[selector] = from;
}
elements = selectResolvers[selector](elements, Snapshot, doc, root, from, callback);
Config.CACHING && Dom.saveResults(original, from, doc, elements);
return elements;
},
FN = function(x) { return x; },
matchContexts = { },
matchResolvers = { },
selectContexts = { },
selectResolvers = { },
Snapshot = {
byId: _byId,
match: match,
select: select,
getAttribute: getAttribute,
hasAttribute: hasAttribute
},
Dom = {
ACCEPT_NODE: ACCEPT_NODE,
byId: byId,
match: match,
first: first,
select: select,
compile: compile,
configure: configure,
setCache: FN,
shortcuts: FN,
loadResults: FN,
saveResults: FN,
emit: emit,
Config: Config,
Snapshot: Snapshot,
Operators: Operators,
Selectors: Selectors,
Tokens: Tokens,
Version: version,
registerOperator:
function(symbol, resolver) {
Operators[symbol] || (Operators[symbol] = resolver);
},
registerSelector:
function(name, rexp, func) {
Selectors[name] || (Selectors[name] = {
Expression: rexp,
Callback: func
});
}
};
initialize(doc);
return Dom;
});

981
node_modules/nwmatcher/src/nwmatcher-noqsa.js generated vendored Normal file
View File

@@ -0,0 +1,981 @@
/*
* Copyright (C) 2007-2018 Diego Perini
* All rights reserved.
*
* nwmatcher-noqsa.js - A fast CSS selector engine and matcher
*
* Author: Diego Perini <diego.perini at gmail com>
* Version: 1.4.4
* Created: 20070722
* Release: 20180305
*
* License:
* http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
* Download:
* http://javascript.nwbox.com/NWMatcher/nwmatcher.js
*/
(function(global, factory) {
if (typeof module == 'object' && typeof exports == 'object') {
module.exports = factory;
} else if (typeof define === 'function' && define["amd"]) {
define(factory);
} else {
global.NW || (global.NW = { });
global.NW.Dom = factory(global);
}
})(this, function(global) {
var version = 'nwmatcher-1.4.4',
doc = global.document,
root = doc.documentElement,
isSingleMatch,
isSingleSelect,
lastSlice,
lastContext,
lastPosition,
lastMatcher,
lastSelector,
lastPartsMatch,
lastPartsSelect,
prefixes = '(?:[#.:]|::)?',
operators = '([~*^$|!]?={1})',
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 = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"' + "|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'",
reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g,
reTrimSpaces = RegExp('[\\n\\r\\f]|^' + whitespace + '+|' + whitespace + '+$', 'g'),
reEscapedChars = /\\([0-9a-fA-F]{1,6}[\x20\t\n\r\f]?|.)|([\x22\x27])/g,
standardValidator, extendedValidator, reValidator,
attrcheck, attributes, attrmatcher, pseudoclass,
reOptimizeSelector, reSimpleNot, reSplitToken,
Optimize, identifier, extensions = '.+',
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,})\)|(?:matches|not)\(\s?(:nth(?:-last)?(?:-child|-of-type)\(\s?(?:even|odd|(?:[-+]{0,1}\d*n\s?)?[-+]{0,1}\s?\d*)\s?\)|[^()]*)\s?\))?(.*)/i,
epseudos: /^((?:[:]{1,2}(?:after|before|first-letter|first-line))|(?:[:]{2,2}(?:selection|backdrop|placeholder)))?(.*)/i,
children: RegExp('^' + whitespace + '?\\>' + whitespace + '?(.*)'),
adjacent: RegExp('^' + whitespace + '?\\+' + whitespace + '?(.*)'),
relative: RegExp('^' + whitespace + '?\\~' + whitespace + '?(.*)'),
ancestor: RegExp('^' + whitespace + '+(.*)'),
universal: RegExp('^\\*(.*)')
},
Tokens = {
prefixes: prefixes,
identifier: identifier,
attributes: attributes
},
QUIRKS_MODE,
XML_DOCUMENT,
GEBTN = 'getElementsByTagName' in doc,
GEBCN = 'getElementsByClassName' in doc,
IE_LT_9 = typeof doc.addEventListener != 'function',
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 = {
value: 'defaultValue',
checked: 'defaultChecked',
selected: 'defaultSelected'
},
ATTR_URIDATA = {
action: 2, cite: 2, codebase: 2, data: 2, href: 2,
longdesc: 2, lowsrc: 2, src: 2, usemap: 2
},
HTML_TABLE = {
'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1,
'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1,
'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1,
'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1,
'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1,
'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1,
'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1,
'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1
},
NATIVE_TRAVERSAL_API =
'nextElementSibling' in root &&
'previousElementSibling' in root,
Selectors = { },
Operators = {
'=': "n=='%m'",
'^=': "n.indexOf('%m')==0",
'*=': "n.indexOf('%m')>-1",
'|=': "(n+'-').indexOf('%m-')==0",
'~=': "(' '+n+' ').indexOf(' %m ')>-1",
'$=': "n.substr(n.length-'%m'.length)=='%m'"
},
concatCall =
function(data, elements, callback) {
var i = -1, element;
while ((element = elements[++i])) {
if (false === callback(data[data.length] = element)) { break; }
}
return data;
},
switchContext =
function(from, force) {
var oldDoc = doc;
lastContext = from;
doc = from.ownerDocument || from;
if (force || oldDoc !== doc) {
root = doc.documentElement;
XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
QUIRKS_MODE = !XML_DOCUMENT &&
typeof doc.compatMode == 'string' ?
doc.compatMode.indexOf('CSS') < 0 :
(function() {
var style = doc.createElement('div').style;
return style && (style.width = 1) && style.width == '1px';
})();
Config.CACHING && Dom.setCache(true, doc);
}
},
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(reEscapedChars,
function(substring, p1, p2) {
return p2 ? '\\' + p2 :
(/^[0-9a-fA-F]/).test(p1) ? codePointToUTF16(parseInt(p1, 16)) :
(/^[\\\x22\x27]/).test(p1) ? substring :
p1;
}
);
},
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;
}
);
},
byIdRaw =
function(id, elements) {
var i = -1, element;
while ((element = elements[++i])) {
if (element.getAttribute('id') == id) {
break;
}
}
return element || null;
},
_byId = !IE_LT_9 ?
function(id, from) {
id = (/\\/).test(id) ? unescapeIdentifier(id) : id;
return from.getElementById && from.getElementById(id) ||
byIdRaw(id, from.getElementsByTagName('*'));
} :
function(id, from) {
var element = null;
id = (/\\/).test(id) ? unescapeIdentifier(id) : id;
if (XML_DOCUMENT || from.nodeType != 9) {
return byIdRaw(id, from.getElementsByTagName('*'));
}
if ((element = from.getElementById(id)) &&
element.name == id && from.getElementsByName) {
return byIdRaw(id, from.getElementsByName(id));
}
return element;
},
byId =
function(id, from) {
from || (from = doc);
if (lastContext !== from) { switchContext(from); }
return _byId(id, from);
},
byTagRaw =
function(tag, from) {
var any = tag == '*', element = from, elements = [ ], next = element.firstChild;
any || (tag = tag.toUpperCase());
while ((element = next)) {
if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) {
elements[elements.length] = element;
}
if ((next = element.firstChild || element.nextSibling)) continue;
while (!next && (element = element.parentNode) && element !== from) {
next = element.nextSibling;
}
}
return elements;
},
contains = 'compareDocumentPosition' in root ?
function(container, element) {
return (container.compareDocumentPosition(element) & 16) == 16;
} : 'contains' in root ?
function(container, element) {
return container !== element && container.contains(element);
} :
function(container, element) {
while ((element = element.parentNode)) {
if (element === container) return true;
}
return false;
},
getAttribute = !IE_LT_9 ?
function(node, attribute) {
return node.getAttribute(attribute);
} :
function(node, attribute) {
attribute = attribute.toLowerCase();
if (typeof node[attribute] == 'object') {
return node.attributes[attribute] &&
node.attributes[attribute].value;
}
return (
attribute == 'type' ? node.getAttribute(attribute) :
ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) :
ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
(node = node.getAttributeNode(attribute)) && node.value);
},
hasAttribute = !IE_LT_9 && root.hasAttribute ?
function(node, attribute) {
return node.hasAttribute(attribute);
} :
function(node, attribute) {
var obj = node.getAttributeNode(attribute = attribute.toLowerCase());
return ATTR_DEFAULT[attribute] && attribute != 'value' ?
node[ATTR_DEFAULT[attribute]] : obj && obj.specified;
},
isEmpty =
function(node) {
node = node.firstChild;
while (node) {
if (node.nodeType == 3 || node.nodeName > '@') return false;
node = node.nextSibling;
}
return true;
},
isLink =
function(element) {
return hasAttribute(element, 'href') && LINK_NODES[element.nodeName];
},
nthElement =
function(element, last) {
var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
while ((element = element[succ])) {
if (element.nodeName > '@') ++count;
}
return count;
},
nthOfType =
function(element, last) {
var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
while ((element = element[succ])) {
if (element.nodeName == type) ++count;
}
return count;
},
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 (Config.LOGERRORS && console && console.log) {
console.log(message);
}
},
Config = {
CACHING: false,
ESCAPECHR: true,
NON_ASCII: true,
SELECTOR3: true,
UNICODE16: true,
SHORTCUTS: false,
SIMPLENOT: true,
SVG_LCASE: false,
UNIQUE_ID: true,
USE_HTML5: true,
VERBOSITY: true,
LOGERRORS: 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 + '*' + '(i)?' + 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 =
function(selector, source, mode) {
var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;
typeof source == 'string' || (source = '');
if (parts.length == 1) {
source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
} else {
var i = -1, seen = { }, token;
while ((token = parts[++i])) {
token = token.replace(reTrimSpaces, '');
if (!seen[token] && (seen[token] = true)) {
source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
}
}
}
if (mode) {
return Function('c,s,d,h,g,f',
'var N,n,x=0,k=-1,e,r=[];main:while((e=c[++k])){' + source + '}return r;');
} else {
return Function('e,s,d,h,g,f',
'var N,n,x=0,k=e;' + source + 'return false;');
}
},
compileSelector =
function(selector, source, mode) {
var a, b, n, k = 0, expr, match, result, status, test, type;
while (selector) {
k++;
if ((match = selector.match(Patterns.universal))) {
expr = '';
}
else if ((match = selector.match(Patterns.id))) {
match[1] = (/\\/).test(match[1]) ? convertEscapes(match[1]) : match[1];
source = 'if(' + (XML_DOCUMENT ?
's.getAttribute(e,"id")' :
'(e.submit?s.getAttribute(e,"id"):e.id)') +
'=="' + match[1] + '"' +
'){' + source + '}';
}
else if ((match = selector.match(Patterns.tagName))) {
test = Config.SVG_LCASE ? '||e.nodeName=="' + match[1].toLowerCase() + '"' : '';
source = 'if(e.nodeName' + (XML_DOCUMENT ?
'=="' + match[1] + '"' : TO_UPPER_CASE +
'=="' + match[1].toUpperCase() + '"' + test) +
'){' + source + '}';
}
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(/' + whitespace + '+/g," ")+" ").indexOf(" ' + match[1] + ' ")>-1' +
'){' + source + '}';
}
else if ((match = selector.match(Patterns.attribute))) {
expr = match[1].split(':');
expr = expr.length == 2 ? expr[1] : expr[0] + '';
if (match[2] && !Operators[match[2]]) {
emit('Unsupported operator in attribute selectors "' + selector + '"');
return '';
}
test = 'false';
if (match[2] && match[4] && (test = Operators[match[2]])) {
match[4] = (/\\/).test(match[4]) ? convertEscapes(match[4]) : match[4];
type = match[5] == 'i' || HTML_TABLE[expr.toLowerCase()];
test = test.replace(/\%m/g, type ? match[4].toLowerCase() : match[4]);
} else if (match[2] == '!=' || match[2] == '=') {
test = 'n' + match[2] + '=""';
}
source = 'if(n=s.hasAttribute(e,"' + match[1] + '")){' +
(match[2] ? 'n=s.getAttribute(e,"' + match[1] + '")' : '') +
(type && match[2] ? '.toLowerCase();' : ';') +
'if(' + (match[2] ? test : 'n') + '){' + source + '}}';
}
else if ((match = selector.match(Patterns.adjacent))) {
source = NATIVE_TRAVERSAL_API ?
'var N' + k + '=e;if((e=e.previousElementSibling)){' + source + '}e=N' + k + ';' :
'var N' + k + '=e;while((e=e.previousSibling)){if(e.nodeType==1){' + source + 'break;}}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.relative))) {
source = NATIVE_TRAVERSAL_API ?
'var N' + k + '=e;while((e=e.previousElementSibling)){' + source + '}e=N' + k + ';' :
'var N' + k + '=e;while((e=e.previousSibling)){if(e.nodeType==1){' + source + '}}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.children))) {
source = 'var N' + k + '=e;if((e=e.parentNode)&&e.nodeType==1){' + source + '}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.ancestor))) {
source = 'var N' + k + '=e;while((e=e.parentNode)&&e.nodeType==1){' + source + '}e=N' + k + ';';
}
else if ((match = selector.match(Patterns.spseudos)) && match[1]) {
switch (match[1]) {
case 'root':
if (match[3]) {
source = 'if(e===h||s.contains(h,e)){' + source + '}';
} else {
source = 'if(e===h){' + source + '}';
}
break;
case 'empty':
source = 'if(s.isEmpty(e)){' + source + '}';
break;
default:
if (match[1] && match[2]) {
if (match[2] == 'n') {
source = 'if(e!==h){' + source + '}';
break;
} else if (match[2] == 'even') {
a = 2;
b = 0;
} else if (match[2] == 'odd') {
a = 2;
b = 1;
} else {
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;
}
test = a > 1 ?
(/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
(/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a === 0 ?
'n==' + b : a == -1 ? 'n<=' + b : 'n>=' + b;
source =
'if(e!==h){' +
'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
'(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
'if(' + test + '){' + source + '}' +
'}';
} else {
a = /first/i.test(match[1]) ? 'previous' : 'next';
n = /only/i.test(match[1]) ? 'previous' : 'next';
b = /first|last/i.test(match[1]);
type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"';
source = 'if(e!==h){' +
( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
}
break;
}
}
else if ((match = selector.match(Patterns.dpseudos)) && match[1]) {
switch (match[1].match(/^\w+/)[0]) {
case 'matches':
expr = match[3].replace(reTrimSpaces, '');
source = 'if(s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
break;
case 'not':
expr = match[3].replace(reTrimSpaces, '');
if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
emit('Negation pseudo-class only accepts simple selectors "' + selector + '"');
return '';
} else {
if ('compatMode' in doc) {
source = 'if(!' + compile(expr, '', false) + '(e,s,d,h,g)){' + source + '}';
} else {
source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
}
}
break;
case 'checked':
source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
(Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
'){' + source + '}';
break;
case 'disabled':
source = 'if(((typeof e.form!=="undefined"' +
(Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
')||s.isLink(e))&&e.disabled===true){' + source + '}';
break;
case 'enabled':
source = 'if(((typeof e.form!=="undefined"' +
(Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
')||s.isLink(e))&&e.disabled===false){' + source + '}';
break;
case 'lang':
test = '';
if (match[2]) test = match[2].substr(0, 2) + '-';
source = 'do{(n=e.lang||"").toLowerCase();' +
'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
'(n&&(n=="' + match[2].toLowerCase() +
'"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
'{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
break;
case 'target':
source = 'if(e.id==d.location.hash.slice(1)){' + source + '}';
break;
case 'link':
source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
break;
case 'visited':
source = 'if(s.isLink(e)&&e.visited){' + source + '}';
break;
case 'active':
source = 'if(e===d.activeElement){' + source + '}';
break;
case 'hover':
source = 'if(e===d.hoverElement){' + source + '}';
break;
case 'focus':
source = 'hasFocus' in doc ?
'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||typeof e.tabIndex=="number")){' + source + '}' :
'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
break;
case 'selected':
source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}';
break;
default:
break;
}
}
else if ((match = selector.match(Patterns.epseudos)) && match[1]) {
source = 'if(!(/1|11/).test(e.nodeType)){' + source + '}';
}
else {
expr = false;
status = false;
for (expr in Selectors) {
if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
result = Selectors[expr].Callback(match, source);
if ('match' in result) { match = result.match; }
source = result.source;
status = result.status;
if (status) { break; }
}
}
if (!status) {
emit('Unknown pseudo-class selector "' + selector + '"');
return '';
}
if (!expr) {
emit('Unknown token in selector "' + selector + '"');
return '';
}
}
if (!match) {
emit('Invalid syntax in selector "' + selector + '"');
return '';
}
selector = match && match[match.length - 1];
}
return source;
},
match =
function(element, selector, from, callback) {
var parts;
if (!(element && element.nodeType == 1)) {
emit('Invalid element argument');
return false;
} else if (typeof selector != 'string') {
emit('Invalid selector argument');
return false;
} else if (lastContext !== from) {
switchContext(from || (from = element.ownerDocument));
}
selector = selector.
replace(reTrimSpaces, '').
replace(/\x00|\\$/g, '\ufffd');
Config.SHORTCUTS && (selector = Dom.shortcuts(selector, element, from));
if (lastMatcher != selector) {
if ((parts = selector.match(reValidator)) && parts[0] == selector) {
isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
lastMatcher = selector;
lastPartsMatch = parts;
} else {
emit('The string "' + selector + '", is not a valid CSS selector');
return false;
}
} else parts = lastPartsMatch;
if (!matchResolvers[selector] || matchContexts[selector] !== from) {
matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
matchContexts[selector] = from;
}
return matchResolvers[selector](element, Snapshot, doc, root, from, callback);
},
first =
function(selector, from) {
return select(selector, from, function() { return false; })[0] || null;
},
select =
function(selector, from, callback) {
var i, changed, element, elements, parts, token, original = selector;
if (arguments.length === 0) {
emit('Not enough arguments');
return [ ];
} else if (typeof selector != 'string') {
return [ ];
} else if (from && !(/1|9|11/).test(from.nodeType)) {
emit('Invalid or illegal context element');
return [ ];
} else if (lastContext !== from) {
switchContext(from || (from = doc));
}
if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
return callback ? concatCall([ ], elements, callback) : elements;
}
selector = selector.
replace(reTrimSpaces, '').
replace(/\x00|\\$/g, '\ufffd');
Config.SHORTCUTS && (selector = Dom.shortcuts(selector, from));
if ((changed = lastSelector != selector)) {
if ((parts = selector.match(reValidator)) && parts[0] == selector) {
isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
lastSelector = selector;
lastPartsSelect = parts;
} else {
emit('The string "' + selector + '", is not a valid CSS selector');
return [ ];
}
} else parts = lastPartsSelect;
if (from.nodeType == 11) {
elements = byTagRaw('*', from);
} else if (isSingleSelect) {
if (changed) {
parts = selector.match(reSplitToken);
token = parts[parts.length - 1];
lastSlice = token.split(':not');
lastSlice = lastSlice[lastSlice.length - 1];
lastPosition = selector.length - token.length;
}
if (Config.UNIQUE_ID && lastSlice && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
if ((element = _byId(token, from))) {
if (match(element, selector)) {
callback && callback(element);
elements = [element];
} else elements = [ ];
}
}
else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
if ((element = _byId(token, doc))) {
if ('#' + token == selector) {
callback && callback(element);
elements = [element];
} else if (/[>+~]/.test(selector)) {
from = element.parentNode;
} else {
from = element;
}
} else elements = [ ];
}
if (elements) {
Config.CACHING && Dom.saveResults(original, from, doc, elements);
return elements;
}
if (!XML_DOCUMENT && GEBTN && lastSlice && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
if ((elements = from.getElementsByTagName(token)).length === 0) { return [ ]; }
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
}
else if (!XML_DOCUMENT && GEBCN && lastSlice && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
if ((elements = from.getElementsByClassName(unescapeIdentifier(token))).length === 0) { return [ ]; }
selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token,
reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*');
}
}
if (!elements) {
if (IE_LT_9) {
elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.children : byTagRaw('*', from);
} else {
elements = from.getElementsByTagName('*');
}
}
if (!selectResolvers[selector] || selectContexts[selector] !== from) {
selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true);
selectContexts[selector] = from;
}
elements = selectResolvers[selector](elements, Snapshot, doc, root, from, callback);
Config.CACHING && Dom.saveResults(original, from, doc, elements);
return elements;
},
FN = function(x) { return x; },
matchContexts = { },
matchResolvers = { },
selectContexts = { },
selectResolvers = { },
Snapshot = {
byId: _byId,
match: match,
select: select,
isLink: isLink,
isEmpty: isEmpty,
contains: contains,
nthOfType: nthOfType,
nthElement: nthElement,
getAttribute: getAttribute,
hasAttribute: hasAttribute
},
Dom = {
ACCEPT_NODE: ACCEPT_NODE,
byId: byId,
match: match,
first: first,
select: select,
compile: compile,
contains: contains,
configure: configure,
getAttribute: getAttribute,
hasAttribute: hasAttribute,
setCache: FN,
shortcuts: FN,
loadResults: FN,
saveResults: FN,
emit: emit,
Config: Config,
Snapshot: Snapshot,
Operators: Operators,
Selectors: Selectors,
Tokens: Tokens,
Version: version,
registerOperator:
function(symbol, resolver) {
Operators[symbol] || (Operators[symbol] = resolver);
},
registerSelector:
function(name, rexp, func) {
Selectors[name] || (Selectors[name] = {
Expression: rexp,
Callback: func
});
}
};
initialize(doc);
return Dom;
});

1776
node_modules/nwmatcher/src/nwmatcher.js generated vendored Normal file

File diff suppressed because it is too large Load Diff