diff options
Diffstat (limited to 'school/node_modules/nwsapi/src/modules')
-rw-r--r-- | school/node_modules/nwsapi/src/modules/nwsapi-jquery.js | 135 | ||||
-rw-r--r-- | school/node_modules/nwsapi/src/modules/nwsapi-traversal.js | 90 |
2 files changed, 225 insertions, 0 deletions
diff --git a/school/node_modules/nwsapi/src/modules/nwsapi-jquery.js b/school/node_modules/nwsapi/src/modules/nwsapi-jquery.js new file mode 100644 index 0000000..961cb30 --- /dev/null +++ b/school/node_modules/nwsapi/src/modules/nwsapi-jquery.js @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2007-2017 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, mode, callback) { + + var status = true, + macro = mode ? NW.Dom.S_BODY : NW.Dom.M_BODY; + + macro = macro.replace('@', typeof callback == 'function' ? (mode ? NW.Dom.S_TEST : NW.Dom.M_TEST) : ''); + + switch (match[1].toLowerCase()) { + case 'odd': + source = source.replace(macro, 'if((n=n^1)==0){' + macro + '}'); + break; + case 'even': + source = source.replace(macro, 'if((n=n^1)==1){' + macro + '}'); + break; + case 'first': + source = 'n=s.root.getElementsByTagName(e.nodeName);if(n.length&&n[0]===e){' + source + '}'; + break; + case 'last': + source = 'n=s.root.getElementsByTagName(e.nodeName);if(n.length&&n[n.length-1]===e){' + source + '}'; + break; + default: + switch (match[2].toLowerCase()) { + case 'nth': + source = 'n=s.root.getElementsByTagName(e.nodeName);if(n.length&&n[' + match[3] + ']===e){' + source + '}'; + break; + case 'eq': + source = source.replace(macro, 'if(x++==' + match[3] + '){' + macro + '}'); + break; + case 'lt': + source = source.replace(macro, 'if(x++<' + match[3] + '){' + macro + '}'); + break; + case 'gt': + source = source.replace(macro, 'if(x++>' + match[3] + '){' + macro + '}'); + break; + default: + status = false; + break; + } + break; + } + + // compiler will add this to "source" + return { + 'source': source, + 'status': status, + 'modvar': 'x=0' + }; + + }; + + })(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, mode, callback) { + + var status = true, + macro = mode ? NW.Dom.S_BODY : NW.Dom.M_BODY; + + macro = macro.replace('@', typeof callback == 'function' ? (mode ? NW.Dom.S_TEST : NW.Dom.M_TEST) : ''); + + switch(match[1].toLowerCase()) { + case 'has': + source = source.replace(macro, 'if(e.getElementsByTagName("' + match[3].replace(/^\s|\s$/g, '') + '")[0]){' + macro + '}'); + 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': + source = 'if(/^button$/i.test(e.nodeName)){' + source + '}'; + break; + case 'input': + source = 'if(/^(?:button|input|select|textarea)$/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)); diff --git a/school/node_modules/nwsapi/src/modules/nwsapi-traversal.js b/school/node_modules/nwsapi/src/modules/nwsapi-traversal.js new file mode 100644 index 0000000..9d2b62f --- /dev/null +++ b/school/node_modules/nwsapi/src/modules/nwsapi-traversal.js @@ -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); |