MaskFormat.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
  2. import _createClass from "@babel/runtime/helpers/esm/createClass";
  3. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  4. var FORMAT_KEYS = ['YYYY', 'MM', 'DD', 'HH', 'mm', 'ss', 'SSS'];
  5. // Use Chinese character to avoid conflict with the mask format
  6. var REPLACE_KEY = '顧';
  7. var MaskFormat = /*#__PURE__*/function () {
  8. function MaskFormat(format) {
  9. _classCallCheck(this, MaskFormat);
  10. _defineProperty(this, "format", void 0);
  11. _defineProperty(this, "maskFormat", void 0);
  12. _defineProperty(this, "cells", void 0);
  13. _defineProperty(this, "maskCells", void 0);
  14. this.format = format;
  15. // Generate mask format
  16. var replaceKeys = FORMAT_KEYS.map(function (key) {
  17. return "(".concat(key, ")");
  18. }).join('|');
  19. var replaceReg = new RegExp(replaceKeys, 'g');
  20. this.maskFormat = format.replace(replaceReg,
  21. // Use Chinese character to avoid user use it in format
  22. function (key) {
  23. return REPLACE_KEY.repeat(key.length);
  24. });
  25. // Generate cells
  26. var cellReg = new RegExp("(".concat(FORMAT_KEYS.join('|'), ")"));
  27. var strCells = (format.split(cellReg) || []).filter(function (str) {
  28. return str;
  29. });
  30. var offset = 0;
  31. this.cells = strCells.map(function (text) {
  32. var mask = FORMAT_KEYS.includes(text);
  33. var start = offset;
  34. var end = offset + text.length;
  35. offset = end;
  36. return {
  37. text: text,
  38. mask: mask,
  39. start: start,
  40. end: end
  41. };
  42. });
  43. // Mask cells
  44. this.maskCells = this.cells.filter(function (cell) {
  45. return cell.mask;
  46. });
  47. }
  48. _createClass(MaskFormat, [{
  49. key: "getSelection",
  50. value: function getSelection(maskCellIndex) {
  51. var _ref = this.maskCells[maskCellIndex] || {},
  52. start = _ref.start,
  53. end = _ref.end;
  54. return [start || 0, end || 0];
  55. }
  56. /** Check given text match format */
  57. }, {
  58. key: "match",
  59. value: function match(text) {
  60. for (var i = 0; i < this.maskFormat.length; i += 1) {
  61. var maskChar = this.maskFormat[i];
  62. var textChar = text[i];
  63. if (!textChar || maskChar !== REPLACE_KEY && maskChar !== textChar) {
  64. return false;
  65. }
  66. }
  67. return true;
  68. }
  69. /** Get mask cell count */
  70. }, {
  71. key: "size",
  72. value: function size() {
  73. return this.maskCells.length;
  74. }
  75. }, {
  76. key: "getMaskCellIndex",
  77. value: function getMaskCellIndex(anchorIndex) {
  78. var closetDist = Number.MAX_SAFE_INTEGER;
  79. var closetIndex = 0;
  80. for (var i = 0; i < this.maskCells.length; i += 1) {
  81. var _this$maskCells$i = this.maskCells[i],
  82. start = _this$maskCells$i.start,
  83. end = _this$maskCells$i.end;
  84. if (anchorIndex >= start && anchorIndex <= end) {
  85. return i;
  86. }
  87. var dist = Math.min(Math.abs(anchorIndex - start), Math.abs(anchorIndex - end));
  88. if (dist < closetDist) {
  89. closetDist = dist;
  90. closetIndex = i;
  91. }
  92. }
  93. return closetIndex;
  94. }
  95. }]);
  96. return MaskFormat;
  97. }();
  98. export { MaskFormat as default };