number.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.normalizeSides = exports.parseCssNumeric = exports.normalizePercentage = exports.isPercentage = exports.random = exports.mod = exports.clamp = exports.isNumber = void 0;
  4. var lodash_es_1 = require("lodash-es");
  5. Object.defineProperty(exports, "isNumber", { enumerable: true, get: function () { return lodash_es_1.isNumber; } });
  6. Object.defineProperty(exports, "clamp", { enumerable: true, get: function () { return lodash_es_1.clamp; } });
  7. /**
  8. * Returns the remainder of division of `n` by `m`. You should use this
  9. * instead of the built-in operation as the built-in operation does not
  10. * properly handle negative numbers.
  11. */
  12. function mod(n, m) {
  13. return ((n % m) + m) % m;
  14. }
  15. exports.mod = mod;
  16. function random(lower, upper) {
  17. if (upper == null) {
  18. upper = lower == null ? 1 : lower; // eslint-disable-line
  19. lower = 0; // eslint-disable-line
  20. }
  21. else if (upper < lower) {
  22. const tmp = lower;
  23. lower = upper; // eslint-disable-line
  24. upper = tmp; // eslint-disable-line
  25. }
  26. return Math.floor(Math.random() * (upper - lower + 1) + lower);
  27. }
  28. exports.random = random;
  29. function isPercentage(val) {
  30. return typeof val === 'string' && val.slice(-1) === '%';
  31. }
  32. exports.isPercentage = isPercentage;
  33. function normalizePercentage(num, ref) {
  34. if (num == null) {
  35. return 0;
  36. }
  37. let raw;
  38. if (typeof num === 'string') {
  39. raw = parseFloat(num);
  40. if (isPercentage(num)) {
  41. raw /= 100;
  42. if (Number.isFinite(raw)) {
  43. return raw * ref;
  44. }
  45. }
  46. }
  47. else {
  48. raw = num;
  49. }
  50. if (!Number.isFinite(raw)) {
  51. return 0;
  52. }
  53. if (raw > 0 && raw < 1) {
  54. return raw * ref;
  55. }
  56. return raw;
  57. }
  58. exports.normalizePercentage = normalizePercentage;
  59. function parseCssNumeric(val, units) {
  60. function getUnit(regexp) {
  61. const matches = new RegExp(`(?:\\d+(?:\\.\\d+)*)(${regexp})$`).exec(val);
  62. if (!matches) {
  63. return null;
  64. }
  65. return matches[1];
  66. }
  67. const number = parseFloat(val);
  68. if (Number.isNaN(number)) {
  69. return null;
  70. }
  71. // determine the unit
  72. let regexp;
  73. if (units == null) {
  74. // accept any unit, as well as no unit
  75. regexp = '[A-Za-z]*';
  76. }
  77. else if (Array.isArray(units)) {
  78. if (units.length === 0) {
  79. return null;
  80. }
  81. regexp = units.join('|');
  82. }
  83. else if (typeof units === 'string') {
  84. regexp = units;
  85. }
  86. const unit = getUnit(regexp);
  87. if (unit === null) {
  88. return null;
  89. }
  90. return {
  91. unit,
  92. value: number,
  93. };
  94. }
  95. exports.parseCssNumeric = parseCssNumeric;
  96. function normalizeSides(box) {
  97. if (typeof box === 'object') {
  98. let left = 0;
  99. let top = 0;
  100. let right = 0;
  101. let bottom = 0;
  102. if (box.vertical != null && Number.isFinite(box.vertical)) {
  103. top = bottom = box.vertical;
  104. }
  105. if (box.horizontal != null && Number.isFinite(box.horizontal)) {
  106. right = left = box.horizontal;
  107. }
  108. if (box.left != null && Number.isFinite(box.left))
  109. left = box.left;
  110. if (box.top != null && Number.isFinite(box.top))
  111. top = box.top;
  112. if (box.right != null && Number.isFinite(box.right))
  113. right = box.right;
  114. if (box.bottom != null && Number.isFinite(box.bottom))
  115. bottom = box.bottom;
  116. return { top, right, bottom, left };
  117. }
  118. let val = 0;
  119. if (box != null && Number.isFinite(box)) {
  120. val = box;
  121. }
  122. return { top: val, right: val, bottom: val, left: val };
  123. }
  124. exports.normalizeSides = normalizeSides;
  125. //# sourceMappingURL=number.js.map