MaskFormat.js 3.4 KB

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