Вход Регистрация
Файл: error-kitty/node_modules/cheerio/node_modules/CSSselect/lib/compile.js
Строк: 119
<?php
/*
    compiles a selector to an executable function
*/

module.exports compile;
module.exports.compileUnsafe compileUnsafe;

var 
parse       = require("CSSwhat"),
    
DomUtils    = require("domutils"),
    
isTag       DomUtils.isTag,
    
Rules       = require("./general.js"),
    
sortRules   = require("./sort.js"),
    
BaseFuncs   = require("./basefunctions.js"),
    
trueFunc    BaseFuncs.trueFunc,
    
falseFunc   BaseFuncs.falseFunc;

function 
compile(selectoroptions){
    var 
next compileUnsafe(selectoroptions);

    return function 
base(elem){
        return 
isTag(elem) && next(elem);
    };
}

function 
compileUnsafe(selectoroptions){
    return 
parse(selectoroptions)
        .
map(compileRules)
        .
reduce(reduceRulesfalseFunc);
}

function 
compileRules(arr){
    if(
arr.length === 0) return falseFunc;
    return 
sortRules(arr).reduce(function(funcrule){
        if(
func === falseFunc) return func;
        return 
Rules[rule.type](funcrule);
    }, 
trueFunc);
}

function 
reduceRules(ab){
    if(
=== falseFunc || === trueFunc){
        return 
a;
    }
    if(
=== falseFunc || === trueFunc){
        return 
b;
    }

    return function 
combine(elem){
        return 
a(elem) || b(elem);
    };    
}

//:not and :has have to compile selectors
//doing this in lib/pseudos.js would lead to circular dependencies,
//so we add them here

var Pseudos     = require("./pseudos.js"),
    
filters     Pseudos.filters,
    
isParent    Pseudos.pseudos.parent,
    
existsOne   DomUtils.existsOne,
    
getChildren DomUtils.getChildren;

filters.not = function(nextselect){
    var 
func compileUnsafe(select);

    if(
func === falseFunc) return next;
    if(
func === trueFunc)  return falseFunc;

    return function(
elem){
        return !
func(elem) && next(elem);
    };
};

filters.has = function(nextselector){
    var 
func compile(selector);

    if(
func === falseFunc) return falseFunc;
    if(
func === trueFunc)  return function(elem){
            return 
isParent(elem) && next(elem);
        };

    return function 
has(elem){
        return 
next(elem) && existsOne(funcgetChildren(elem));
    };
};
?>
Онлайн: 1
Реклама