| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | 
							- var isTag = require("domelementtype").isTag;
 
- module.exports = {
 
- 	filter: filter,
 
- 	find: find,
 
- 	findOneChild: findOneChild,
 
- 	findOne: findOne,
 
- 	existsOne: existsOne,
 
- 	findAll: findAll
 
- };
 
- function filter(test, element, recurse, limit){
 
- 	if(!Array.isArray(element)) element = [element];
 
- 	if(typeof limit !== "number" || !isFinite(limit)){
 
- 		limit = Infinity;
 
- 	}
 
- 	return find(test, element, recurse !== false, limit);
 
- }
 
- function find(test, elems, recurse, limit){
 
- 	var result = [], childs;
 
- 	for(var i = 0, j = elems.length; i < j; i++){
 
- 		if(test(elems[i])){
 
- 			result.push(elems[i]);
 
- 			if(--limit <= 0) break;
 
- 		}
 
- 		childs = elems[i].children;
 
- 		if(recurse && childs && childs.length > 0){
 
- 			childs = find(test, childs, recurse, limit);
 
- 			result = result.concat(childs);
 
- 			limit -= childs.length;
 
- 			if(limit <= 0) break;
 
- 		}
 
- 	}
 
- 	return result;
 
- }
 
- function findOneChild(test, elems){
 
- 	for(var i = 0, l = elems.length; i < l; i++){
 
- 		if(test(elems[i])) return elems[i];
 
- 	}
 
- 	return null;
 
- }
 
- function findOne(test, elems){
 
- 	var elem = null;
 
- 	for(var i = 0, l = elems.length; i < l && !elem; i++){
 
- 		if(!isTag(elems[i])){
 
- 			continue;
 
- 		} else if(test(elems[i])){
 
- 			elem = elems[i];
 
- 		} else if(elems[i].children.length > 0){
 
- 			elem = findOne(test, elems[i].children);
 
- 		}
 
- 	}
 
- 	return elem;
 
- }
 
- function existsOne(test, elems){
 
- 	for(var i = 0, l = elems.length; i < l; i++){
 
- 		if(
 
- 			isTag(elems[i]) && (
 
- 				test(elems[i]) || (
 
- 					elems[i].children.length > 0 &&
 
- 					existsOne(test, elems[i].children)
 
- 				)
 
- 			)
 
- 		){
 
- 			return true;
 
- 		}
 
- 	}
 
- 	return false;
 
- }
 
- function findAll(test, rootElems){
 
- 	var result = [];
 
- 	var stack = rootElems.slice();
 
- 	while(stack.length){
 
- 		var elem = stack.shift();
 
- 		if(!isTag(elem)) continue;
 
- 		if (elem.children && elem.children.length > 0) {
 
- 			stack.unshift.apply(stack, elem.children);
 
- 		}
 
- 		if(test(elem)) result.push(elem);
 
- 	}
 
- 	return result;
 
- }
 
 
  |