|
|
- "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;
|