"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * Cache to store generated match functions * @type {Object} */ var pMatchFunctionCache = {}; function compare_tagname(tag1, tag2) { if (!tag1) { return !tag2; } if (!tag2) { return !tag1; } return tag1.toLowerCase() === tag2.toLowerCase(); } /** * Function cache */ var functionCache = { f145: function (el, tagName, classes) { 'use strict'; tagName = tagName || ''; classes = classes || []; if (el.id !== tagName.substr(1)) { return false; } for (var cls = classes, i = 0; i < cls.length; i++) { if (el.classNames.indexOf(cls[i]) === -1) { return false; } } return true; }, f45: function (el, tagName, classes) { 'use strict'; tagName = tagName || ''; classes = classes || []; for (var cls = classes, i = 0; i < cls.length; i++) { if (el.classNames.indexOf(cls[i]) === -1) { return false; } } return true; }, f15: function (el, tagName) { 'use strict'; tagName = tagName || ''; if (el.id !== tagName.substr(1)) { return false; } return true; }, f1: function (el, tagName) { 'use strict'; tagName = tagName || ''; if (el.id !== tagName.substr(1)) { return false; } }, f5: function () { 'use strict'; return true; }, f55: function (el, tagName, classes, attr_key) { 'use strict'; tagName = tagName || ''; classes = classes || []; attr_key = attr_key || ''; var attrs = el.attributes; return attrs.hasOwnProperty(attr_key); }, f245: function (el, tagName, classes, attr_key, value) { 'use strict'; tagName = tagName || ''; classes = classes || []; attr_key = attr_key || ''; value = value || ''; var attrs = el.attributes; return Object.keys(attrs).some(function (key) { var val = attrs[key]; return key === attr_key && val === value; }); // for (let cls = classes, i = 0; i < cls.length; i++) {if (el.classNames.indexOf(cls[i]) === -1){ return false;}} // return true; }, f25: function (el, tagName, classes, attr_key, value) { 'use strict'; tagName = tagName || ''; classes = classes || []; attr_key = attr_key || ''; value = value || ''; var attrs = el.attributes; return Object.keys(attrs).some(function (key) { var val = attrs[key]; return key === attr_key && val === value; }); // return true; }, f2: function (el, tagName, classes, attr_key, value) { 'use strict'; tagName = tagName || ''; classes = classes || []; attr_key = attr_key || ''; value = value || ''; var attrs = el.attributes; return Object.keys(attrs).some(function (key) { var val = attrs[key]; return key === attr_key && val === value; }); }, f345: function (el, tagName, classes) { 'use strict'; tagName = tagName || ''; classes = classes || []; if (!compare_tagname(el.tagName, tagName)) { return false; } for (var cls = classes, i = 0; i < cls.length; i++) { if (el.classNames.indexOf(cls[i]) === -1) { return false; } } return true; }, f35: function (el, tagName) { 'use strict'; tagName = tagName || ''; return compare_tagname(el.tagName, tagName); }, f3: function (el, tagName) { 'use strict'; tagName = tagName || ''; // if (el.tagName !== tagName) { // return false; // } return compare_tagname(el.tagName, tagName); } }; /** * Matcher class to make CSS match * * @class Matcher */ var Matcher = /** @class */ (function () { /** * Creates an instance of Matcher. * @param {string} selector * * @memberof Matcher */ function Matcher(selector) { this.nextMatch = 0; this.matchers = selector.split(' ').map(function (matcher) { if (pMatchFunctionCache[matcher]) { return pMatchFunctionCache[matcher]; } var parts = matcher.split('.'); var tagName = parts[0]; var classes = parts.slice(1).sort(); // let source = '"use strict";'; var function_name = 'f'; var attr_key = ''; var value = ''; if (tagName && tagName !== '*') { var reg = void 0; if (tagName.startsWith('#')) { // source += 'if (el.id != ' + JSON.stringify(tagName.substr(1)) + ') return false;';// 1 function_name += '1'; } else { reg = /^\[\s*(\S+)\s*(=|!=)\s*((((["'])([^\6]*)\6))|(\S*?))\]\s*/.exec(tagName); if (reg) { attr_key = reg[1]; var method = reg[2]; if (method !== '=' && method !== '!=') { // eslint-disable-next-line no-template-curly-in-string throw new Error('Selector not supported, Expect [key${op}value].op must be =,!='); } if (method === '=') { method = '=='; } value = reg[7] || reg[8]; // source += `let attrs = el.attributes;for (let key in attrs){const val = attrs[key]; if (key == "${attr_key}" && val == "${value}"){return true;}} return false;`;// 2 function_name += '2'; } else if ((reg = /^\[(.*?)\]/.exec(tagName))) { attr_key = reg[1]; function_name += '5'; } else { // source += 'if (el.tagName != ' + JSON.stringify(tagName) + ') return false;';// 3 function_name += '3'; } } } if (classes.length > 0) { // source += 'for (let cls = ' + JSON.stringify(classes) + ', i = 0; i < cls.length; i++) if (el.classNames.indexOf(cls[i]) === -1) return false;';// 4 function_name += '4'; } // source += 'return true;';// 5 function_name += '5'; var obj = { func: functionCache[function_name], tagName: tagName || '', classes: classes || '', attr_key: attr_key || '', value: value || '' }; // source = source || ''; return (pMatchFunctionCache[matcher] = obj); }); } /** * Trying to advance match pointer * @param {HTMLElement} el element to make the match * @return {bool} true when pointer advanced. */ Matcher.prototype.advance = function (el) { if (this.nextMatch < this.matchers.length && this.matchers[this.nextMatch].func(el, this.matchers[this.nextMatch].tagName, this.matchers[this.nextMatch].classes, this.matchers[this.nextMatch].attr_key, this.matchers[this.nextMatch].value)) { this.nextMatch++; return true; } return false; }; /** * Rewind the match pointer */ Matcher.prototype.rewind = function () { this.nextMatch--; }; Object.defineProperty(Matcher.prototype, "matched", { /** * Trying to determine if match made. * @return {bool} true when the match is made */ get: function () { return this.nextMatch === this.matchers.length; }, enumerable: false, configurable: true }); /** * Rest match pointer. * @return {[type]} [description] */ Matcher.prototype.reset = function () { this.nextMatch = 0; }; /** * flush cache to free memory */ Matcher.prototype.flushCache = function () { pMatchFunctionCache = {}; }; return Matcher; }()); exports.default = Matcher;