attributes.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.attributeRules = void 0;
  4. var boolbase_1 = require("boolbase");
  5. /**
  6. * All reserved characters in a regex, used for escaping.
  7. *
  8. * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license
  9. * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794
  10. */
  11. var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
  12. function escapeRegex(value) {
  13. return value.replace(reChars, "\\$&");
  14. }
  15. /**
  16. * Attribute selectors
  17. */
  18. exports.attributeRules = {
  19. equals: function (next, data, _a) {
  20. var adapter = _a.adapter;
  21. var name = data.name;
  22. var value = data.value;
  23. if (data.ignoreCase) {
  24. value = value.toLowerCase();
  25. return function (elem) {
  26. var attr = adapter.getAttributeValue(elem, name);
  27. return (attr != null &&
  28. attr.length === value.length &&
  29. attr.toLowerCase() === value &&
  30. next(elem));
  31. };
  32. }
  33. return function (elem) {
  34. return adapter.getAttributeValue(elem, name) === value && next(elem);
  35. };
  36. },
  37. hyphen: function (next, data, _a) {
  38. var adapter = _a.adapter;
  39. var name = data.name;
  40. var value = data.value;
  41. var len = value.length;
  42. if (data.ignoreCase) {
  43. value = value.toLowerCase();
  44. return function hyphenIC(elem) {
  45. var attr = adapter.getAttributeValue(elem, name);
  46. return (attr != null &&
  47. (attr.length === len || attr.charAt(len) === "-") &&
  48. attr.substr(0, len).toLowerCase() === value &&
  49. next(elem));
  50. };
  51. }
  52. return function hyphen(elem) {
  53. var attr = adapter.getAttributeValue(elem, name);
  54. return (attr != null &&
  55. (attr.length === len || attr.charAt(len) === "-") &&
  56. attr.substr(0, len) === value &&
  57. next(elem));
  58. };
  59. },
  60. element: function (next, _a, _b) {
  61. var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;
  62. var adapter = _b.adapter;
  63. if (/\s/.test(value)) {
  64. return boolbase_1.falseFunc;
  65. }
  66. var regex = new RegExp("(?:^|\\s)".concat(escapeRegex(value), "(?:$|\\s)"), ignoreCase ? "i" : "");
  67. return function element(elem) {
  68. var attr = adapter.getAttributeValue(elem, name);
  69. return (attr != null &&
  70. attr.length >= value.length &&
  71. regex.test(attr) &&
  72. next(elem));
  73. };
  74. },
  75. exists: function (next, _a, _b) {
  76. var name = _a.name;
  77. var adapter = _b.adapter;
  78. return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };
  79. },
  80. start: function (next, data, _a) {
  81. var adapter = _a.adapter;
  82. var name = data.name;
  83. var value = data.value;
  84. var len = value.length;
  85. if (len === 0) {
  86. return boolbase_1.falseFunc;
  87. }
  88. if (data.ignoreCase) {
  89. value = value.toLowerCase();
  90. return function (elem) {
  91. var attr = adapter.getAttributeValue(elem, name);
  92. return (attr != null &&
  93. attr.length >= len &&
  94. attr.substr(0, len).toLowerCase() === value &&
  95. next(elem));
  96. };
  97. }
  98. return function (elem) {
  99. var _a;
  100. return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&
  101. next(elem);
  102. };
  103. },
  104. end: function (next, data, _a) {
  105. var adapter = _a.adapter;
  106. var name = data.name;
  107. var value = data.value;
  108. var len = -value.length;
  109. if (len === 0) {
  110. return boolbase_1.falseFunc;
  111. }
  112. if (data.ignoreCase) {
  113. value = value.toLowerCase();
  114. return function (elem) {
  115. var _a;
  116. return ((_a = adapter
  117. .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);
  118. };
  119. }
  120. return function (elem) {
  121. var _a;
  122. return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&
  123. next(elem);
  124. };
  125. },
  126. any: function (next, data, _a) {
  127. var adapter = _a.adapter;
  128. var name = data.name, value = data.value;
  129. if (value === "") {
  130. return boolbase_1.falseFunc;
  131. }
  132. if (data.ignoreCase) {
  133. var regex_1 = new RegExp(escapeRegex(value), "i");
  134. return function anyIC(elem) {
  135. var attr = adapter.getAttributeValue(elem, name);
  136. return (attr != null &&
  137. attr.length >= value.length &&
  138. regex_1.test(attr) &&
  139. next(elem));
  140. };
  141. }
  142. return function (elem) {
  143. var _a;
  144. return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&
  145. next(elem);
  146. };
  147. },
  148. not: function (next, data, _a) {
  149. var adapter = _a.adapter;
  150. var name = data.name;
  151. var value = data.value;
  152. if (value === "") {
  153. return function (elem) {
  154. return !!adapter.getAttributeValue(elem, name) && next(elem);
  155. };
  156. }
  157. else if (data.ignoreCase) {
  158. value = value.toLowerCase();
  159. return function (elem) {
  160. var attr = adapter.getAttributeValue(elem, name);
  161. return ((attr == null ||
  162. attr.length !== value.length ||
  163. attr.toLowerCase() !== value) &&
  164. next(elem));
  165. };
  166. }
  167. return function (elem) {
  168. return adapter.getAttributeValue(elem, name) !== value && next(elem);
  169. };
  170. },
  171. };