delta.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import Delta from 'quill-delta';
  2. export function getDeltaText(delta: Delta) {
  3. const text = delta
  4. .filter((op) => typeof op.insert === 'string')
  5. .map((op) => op.insert)
  6. .join('');
  7. return text;
  8. }
  9. export function caretInTopEdgeByDelta(delta: Delta, index: number) {
  10. const text = getDeltaText(delta.slice(0, index));
  11. if (!text) return true;
  12. const firstLine = text.split('\n')[0];
  13. return index <= firstLine.length;
  14. }
  15. export function caretInBottomEdgeByDelta(delta: Delta, index: number) {
  16. const text = getDeltaText(delta.slice(index));
  17. if (!text) return true;
  18. return !text.includes('\n');
  19. }
  20. export function getLineByIndex(delta: Delta, index: number) {
  21. const beforeText = getDeltaText(delta.slice(0, index));
  22. const afterText = getDeltaText(delta.slice(index));
  23. const beforeLines = beforeText.split('\n');
  24. const afterLines = afterText.split('\n');
  25. const startLineText = beforeLines[beforeLines.length - 1];
  26. const currentLineText = startLineText + afterLines[0];
  27. return {
  28. text: currentLineText,
  29. index: beforeText.length - startLineText.length,
  30. };
  31. }
  32. export function transformIndexToPrevLine(delta: Delta, index: number) {
  33. const text = getDeltaText(delta.slice(0, index));
  34. const lines = text.split('\n');
  35. if (lines.length < 2) return 0;
  36. const prevLineText = lines[lines.length - 2];
  37. const transformedIndex = index - prevLineText.length - 1;
  38. return transformedIndex > 0 ? transformedIndex : 0;
  39. }
  40. function getCurrentLineText(delta: Delta, index: number) {
  41. return getLineByIndex(delta, index).text;
  42. }
  43. export function transformIndexToNextLine(delta: Delta, index: number) {
  44. const text = getDeltaText(delta);
  45. const currentLineText = getCurrentLineText(delta, index);
  46. const transformedIndex = index + currentLineText.length + 1;
  47. return transformedIndex > text.length ? text.length : transformedIndex;
  48. }
  49. export function getIndexRelativeEnter(delta: Delta, index: number) {
  50. const text = getDeltaText(delta.slice(0, index));
  51. const beforeLines = text.split('\n');
  52. const beforeLineText = beforeLines[beforeLines.length - 1];
  53. return beforeLineText.length;
  54. }
  55. export function getLastLineIndex(delta: Delta) {
  56. const text = getDeltaText(delta);
  57. const lastIndex = text.lastIndexOf('\n');
  58. return lastIndex === -1 ? 0 : lastIndex + 1;
  59. }
  60. export function getDeltaByRange(
  61. delta: Delta,
  62. range: {
  63. index: number;
  64. length: number;
  65. }
  66. ) {
  67. const start = range.index;
  68. const end = range.index + range.length;
  69. return new Delta(delta.slice(start, end));
  70. }
  71. export function getBeofreExtentDeltaByRange(
  72. delta: Delta,
  73. range: {
  74. index: number;
  75. length: number;
  76. }
  77. ) {
  78. const start = range.index;
  79. return new Delta(delta.slice(0, start));
  80. }
  81. export function getAfterExtentDeltaByRange(
  82. delta: Delta,
  83. range: {
  84. index: number;
  85. length: number;
  86. }
  87. ) {
  88. const start = range.index + range.length;
  89. return new Delta(delta.slice(start));
  90. }