common.js 5.4 KB

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