"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var querying_1 = require("./querying"); var tagtypes_1 = require("./tagtypes"); function isTextNode(node) { return node.type === "text" /* Text */; } /* eslint-disable @typescript-eslint/camelcase */ var Checks = { tag_name: function (name) { if (typeof name === "function") { return function (elem) { return tagtypes_1.isTag(elem) && name(elem.name); }; } else if (name === "*") { return tagtypes_1.isTag; } else { return function (elem) { return tagtypes_1.isTag(elem) && elem.name === name; }; } }, tag_type: function (type) { if (typeof type === "function") { return function (elem) { return type(elem.type); }; } else { return function (elem) { return elem.type === type; }; } }, tag_contains: function (data) { if (typeof data === "function") { return function (elem) { return isTextNode(elem) && data(elem.data); }; } else { return function (elem) { return isTextNode(elem) && elem.data === data; }; } }, }; /* eslint-enable @typescript-eslint/camelcase */ function getAttribCheck(attrib, value) { if (typeof value === "function") { return function (elem) { return tagtypes_1.isTag(elem) && value(elem.attribs[attrib]); }; } else { return function (elem) { return tagtypes_1.isTag(elem) && elem.attribs[attrib] === value; }; } } function combineFuncs(a, b) { return function (elem) { return a(elem) || b(elem); }; } function compileTest(options) { var funcs = Object.keys(options).map(function (key) { var value = options[key]; return key in Checks ? Checks[key](value) : getAttribCheck(key, value); }); return funcs.length === 0 ? null : funcs.reduce(combineFuncs); } function testElement(options, element) { var test = compileTest(options); return test ? test(element) : true; } exports.testElement = testElement; function getElements(options, element, recurse, limit) { if (limit === void 0) { limit = Infinity; } var test = compileTest(options); return test ? querying_1.filter(test, element, recurse, limit) : []; } exports.getElements = getElements; function getElementById(id, element, recurse) { if (recurse === void 0) { recurse = true; } if (!Array.isArray(element)) element = [element]; return querying_1.findOne(getAttribCheck("id", id), element, recurse); } exports.getElementById = getElementById; function getElementsByTagName(name, element, recurse, limit) { if (limit === void 0) { limit = Infinity; } return querying_1.filter(Checks.tag_name(name), element, recurse, limit); } exports.getElementsByTagName = getElementsByTagName; function getElementsByTagType(type, element, recurse, limit) { if (recurse === void 0) { recurse = true; } if (limit === void 0) { limit = Infinity; } return querying_1.filter(Checks.tag_type(type), element, recurse, limit); } exports.getElementsByTagType = getElementsByTagType;