basic.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.overwrite = exports.replaceAll = exports.replace = exports.toString = exports.getLength = void 0;
  4. const binarySearch_1 = require("./binarySearch");
  5. const track_1 = require("./track");
  6. function getLength(segments) {
  7. let length = 0;
  8. for (const segment of segments) {
  9. length += typeof segment == 'string' ? segment.length : segment[0].length;
  10. }
  11. return length;
  12. }
  13. exports.getLength = getLength;
  14. function toString(segments) {
  15. return segments.map(s => typeof s === 'string' ? s : s[0]).join('');
  16. }
  17. exports.toString = toString;
  18. function replace(segments, pattern, ...replacers) {
  19. const str = toString(segments);
  20. const match = str.match(pattern);
  21. if (match && match.index !== undefined) {
  22. const start = match.index;
  23. const end = start + match[0].length;
  24. (0, track_1.offsetStack)();
  25. overwrite(segments, [start, end], ...replacers.map(replacer => typeof replacer === 'function' ? replacer(match[0]) : replacer));
  26. (0, track_1.resetOffsetStack)();
  27. }
  28. }
  29. exports.replace = replace;
  30. function replaceAll(segments, pattern, ...replacers) {
  31. const str = toString(segments);
  32. const allMatch = str.matchAll(pattern);
  33. let length = str.length;
  34. let lengthDiff = 0;
  35. for (const match of allMatch) {
  36. if (match.index !== undefined) {
  37. const start = match.index + lengthDiff;
  38. const end = start + match[0].length;
  39. (0, track_1.offsetStack)();
  40. overwrite(segments, [start, end], ...replacers.map(replacer => typeof replacer === 'function' ? replacer(match[0]) : replacer));
  41. (0, track_1.resetOffsetStack)();
  42. const newLength = getLength(segments);
  43. lengthDiff += newLength - length;
  44. length = newLength;
  45. }
  46. }
  47. }
  48. exports.replaceAll = replaceAll;
  49. function overwrite(segments, range, ...inserts) {
  50. const offsets = toOffsets(segments);
  51. const [start, end] = typeof range === 'number' ? [range, range] : range;
  52. const startIndex = (0, binarySearch_1.binarySearch)(offsets, start);
  53. const endIndex = (0, binarySearch_1.binarySearch)(offsets, end);
  54. const startSegment = segments[startIndex];
  55. const endSegment = segments[endIndex];
  56. const startSegmentStart = offsets[startIndex];
  57. const endSegmentStart = offsets[endIndex];
  58. const endSegmentEnd = offsets[endIndex] + (typeof endSegment === 'string' ? endSegment.length : endSegment[0].length);
  59. if (start > startSegmentStart) {
  60. inserts.unshift(trimSegmentEnd(startSegment, start - startSegmentStart));
  61. }
  62. if (end < endSegmentEnd) {
  63. inserts.push(trimSegmentStart(endSegment, end - endSegmentStart));
  64. }
  65. (0, track_1.offsetStack)();
  66. const deleted = segments.splice(startIndex, endIndex - startIndex + 1, ...inserts);
  67. (0, track_1.resetOffsetStack)();
  68. if (end < endSegmentEnd) {
  69. deleted[deleted.length - 1] = trimSegmentEnd(deleted[deleted.length - 1], end - endSegmentStart);
  70. }
  71. if (start > startSegmentStart) {
  72. deleted[0] = trimSegmentStart(deleted[0], start - startSegmentStart);
  73. }
  74. return deleted;
  75. }
  76. exports.overwrite = overwrite;
  77. function trimSegmentEnd(segment, trimEnd) {
  78. if (typeof segment === 'string') {
  79. return segment.slice(0, trimEnd);
  80. }
  81. const originalString = segment[0];
  82. const originalRange = segment[2];
  83. const newString = originalString.slice(0, trimEnd);
  84. const newRange = typeof originalRange === 'number' ? originalRange : [originalRange[0], originalRange[1] - (originalString.length - newString.length)];
  85. return [
  86. newString,
  87. segment[1],
  88. newRange,
  89. ...segment.slice(3),
  90. ];
  91. }
  92. function trimSegmentStart(segment, trimStart) {
  93. if (typeof segment === 'string') {
  94. return segment.slice(trimStart);
  95. }
  96. const originalString = segment[0];
  97. const originalRange = segment[2];
  98. const newString = originalString.slice(trimStart);
  99. if (trimStart < 0) {
  100. trimStart += originalString.length;
  101. }
  102. const newRange = typeof originalRange === 'number' ? originalRange + trimStart : [originalRange[0] + trimStart, originalRange[1]];
  103. return [
  104. newString,
  105. segment[1],
  106. newRange,
  107. ...segment.slice(3),
  108. ];
  109. }
  110. function toOffsets(segments) {
  111. const offsets = [];
  112. let offset = 0;
  113. for (const segment of segments) {
  114. offsets.push(offset);
  115. offset += typeof segment == 'string' ? segment.length : segment[0].length;
  116. }
  117. return offsets;
  118. }
  119. //# sourceMappingURL=basic.js.map