positionals.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. export const filterNames = new Set([
  2. "first",
  3. "last",
  4. "eq",
  5. "gt",
  6. "nth",
  7. "lt",
  8. "even",
  9. "odd",
  10. ]);
  11. export function isFilter(s) {
  12. if (s.type !== "pseudo")
  13. return false;
  14. if (filterNames.has(s.name))
  15. return true;
  16. if (s.name === "not" && Array.isArray(s.data)) {
  17. // Only consider `:not` with embedded filters
  18. return s.data.some((s) => s.some(isFilter));
  19. }
  20. return false;
  21. }
  22. export function getLimit(filter, data, partLimit) {
  23. const num = data != null ? parseInt(data, 10) : NaN;
  24. switch (filter) {
  25. case "first":
  26. return 1;
  27. case "nth":
  28. case "eq":
  29. return isFinite(num) ? (num >= 0 ? num + 1 : Infinity) : 0;
  30. case "lt":
  31. return isFinite(num)
  32. ? num >= 0
  33. ? Math.min(num, partLimit)
  34. : Infinity
  35. : 0;
  36. case "gt":
  37. return isFinite(num) ? Infinity : 0;
  38. case "odd":
  39. return 2 * partLimit;
  40. case "even":
  41. return 2 * partLimit - 1;
  42. case "last":
  43. case "not":
  44. return Infinity;
  45. }
  46. }
  47. //# sourceMappingURL=positionals.js.map