You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.8 KiB
94 lines
2.8 KiB
"use strict"; |
|
|
|
module.exports = CSSselect; |
|
|
|
var DomUtils = require("domutils"); |
|
var falseFunc = require("boolbase").falseFunc; |
|
var compileRaw = require("./lib/compile.js"); |
|
|
|
function wrapCompile(func) { |
|
return function addAdapter(selector, options, context) { |
|
options = options || {}; |
|
options.adapter = options.adapter || DomUtils; |
|
|
|
return func(selector, options, context); |
|
}; |
|
} |
|
|
|
var compile = wrapCompile(compileRaw); |
|
var compileUnsafe = wrapCompile(compileRaw.compileUnsafe); |
|
|
|
function getSelectorFunc(searchFunc) { |
|
return function select(query, elems, options) { |
|
options = options || {}; |
|
options.adapter = options.adapter || DomUtils; |
|
|
|
if (typeof query !== "function") { |
|
query = compileUnsafe(query, options, elems); |
|
} |
|
if (query.shouldTestNextSiblings) { |
|
elems = appendNextSiblings((options && options.context) || elems, options.adapter); |
|
} |
|
if (!Array.isArray(elems)) elems = options.adapter.getChildren(elems); |
|
else elems = options.adapter.removeSubsets(elems); |
|
return searchFunc(query, elems, options); |
|
}; |
|
} |
|
|
|
function getNextSiblings(elem, adapter) { |
|
var siblings = adapter.getSiblings(elem); |
|
if (!Array.isArray(siblings)) return []; |
|
siblings = siblings.slice(0); |
|
while (siblings.shift() !== elem); |
|
return siblings; |
|
} |
|
|
|
function appendNextSiblings(elems, adapter) { |
|
// Order matters because jQuery seems to check the children before the siblings |
|
if (!Array.isArray(elems)) elems = [elems]; |
|
var newElems = elems.slice(0); |
|
|
|
for (var i = 0, len = elems.length; i < len; i++) { |
|
var nextSiblings = getNextSiblings(newElems[i], adapter); |
|
newElems.push.apply(newElems, nextSiblings); |
|
} |
|
return newElems; |
|
} |
|
|
|
var selectAll = getSelectorFunc(function selectAll(query, elems, options) { |
|
return query === falseFunc || !elems || elems.length === 0 ? [] : options.adapter.findAll(query, elems); |
|
}); |
|
|
|
var selectOne = getSelectorFunc(function selectOne(query, elems, options) { |
|
return query === falseFunc || !elems || elems.length === 0 ? null : options.adapter.findOne(query, elems); |
|
}); |
|
|
|
function is(elem, query, options) { |
|
options = options || {}; |
|
options.adapter = options.adapter || DomUtils; |
|
return (typeof query === "function" ? query : compile(query, options))(elem); |
|
} |
|
|
|
/* |
|
the exported interface |
|
*/ |
|
function CSSselect(query, elems, options) { |
|
return selectAll(query, elems, options); |
|
} |
|
|
|
CSSselect.compile = compile; |
|
CSSselect.filters = compileRaw.Pseudos.filters; |
|
CSSselect.pseudos = compileRaw.Pseudos.pseudos; |
|
|
|
CSSselect.selectAll = selectAll; |
|
CSSselect.selectOne = selectOne; |
|
|
|
CSSselect.is = is; |
|
|
|
//legacy methods (might be removed) |
|
CSSselect.parse = compile; |
|
CSSselect.iterate = selectAll; |
|
|
|
//hooks |
|
CSSselect._compileUnsafe = compileUnsafe; |
|
CSSselect._compileToken = compileRaw.compileToken;
|
|
|