@gravity-ui/markdown-editor 15.32.0 → 15.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +1 -1
  2. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +30 -26
  3. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  4. package/build/cjs/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
  5. package/build/cjs/extensions/behavior/Clipboard/trim-selection.js +55 -0
  6. package/build/cjs/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
  7. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  8. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  9. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  10. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  11. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  12. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
  13. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  14. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  15. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  16. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
  17. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
  20. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  21. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  22. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
  23. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  24. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  25. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
  26. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  27. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  28. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
  29. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  30. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  31. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
  32. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  33. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  34. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  35. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
  36. package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
  37. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  38. package/build/cjs/i18n/codeblock/en.json +1 -0
  39. package/build/cjs/i18n/codeblock/index.d.ts +2 -1
  40. package/build/cjs/i18n/codeblock/ru.json +1 -0
  41. package/build/cjs/i18n/viewer/en.json +3 -0
  42. package/build/cjs/i18n/viewer/index.d.ts +5 -0
  43. package/build/cjs/i18n/viewer/index.js +10 -0
  44. package/build/cjs/i18n/viewer/index.js.map +1 -0
  45. package/build/cjs/i18n/viewer/ru.json +3 -0
  46. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
  47. package/build/cjs/plugins/BaseTooltip/index.js +1 -1
  48. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  49. package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
  50. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  51. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  52. package/build/cjs/toolbar/types.d.ts +1 -0
  53. package/build/cjs/toolbar/types.js.map +1 -1
  54. package/build/cjs/types/node-view.d.ts +11 -0
  55. package/build/cjs/types/node-view.js +3 -0
  56. package/build/cjs/types/node-view.js.map +1 -0
  57. package/build/cjs/utils/truthy.d.ts +4 -0
  58. package/build/cjs/utils/truthy.js +11 -0
  59. package/build/cjs/utils/truthy.js.map +1 -0
  60. package/build/cjs/version.js +1 -1
  61. package/build/cjs/version.js.map +1 -1
  62. package/build/cjs/view/hocs/index.d.ts +1 -0
  63. package/build/cjs/view/hocs/index.js +5 -0
  64. package/build/cjs/view/hocs/index.js.map +1 -0
  65. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  66. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
  67. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  68. package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  69. package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
  70. package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
  71. package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
  72. package/build/cjs/view/index.d.ts +1 -0
  73. package/build/cjs/view/index.js +1 -0
  74. package/build/cjs/view/index.js.map +1 -1
  75. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +1 -1
  76. package/build/esm/extensions/behavior/Clipboard/clipboard.js +12 -8
  77. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  78. package/build/esm/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
  79. package/build/esm/extensions/behavior/Clipboard/trim-selection.js +51 -0
  80. package/build/esm/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
  81. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  82. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  84. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  85. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  86. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
  87. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  88. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  89. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  90. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
  91. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  92. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  93. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
  94. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  95. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  96. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
  97. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  98. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  99. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
  100. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  101. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  102. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
  103. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  104. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  105. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
  106. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  107. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  108. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  109. package/build/esm/extensions/markdown/CodeBlock/index.d.ts +8 -0
  110. package/build/esm/extensions/markdown/CodeBlock/index.js +4 -0
  111. package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
  112. package/build/esm/i18n/codeblock/en.json +1 -0
  113. package/build/esm/i18n/codeblock/index.d.ts +2 -1
  114. package/build/esm/i18n/codeblock/ru.json +1 -0
  115. package/build/esm/i18n/viewer/en.json +3 -0
  116. package/build/esm/i18n/viewer/index.d.ts +5 -0
  117. package/build/esm/i18n/viewer/index.js +6 -0
  118. package/build/esm/i18n/viewer/index.js.map +1 -0
  119. package/build/esm/i18n/viewer/ru.json +3 -0
  120. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
  121. package/build/esm/plugins/BaseTooltip/index.js +1 -1
  122. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  123. package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
  124. package/build/esm/toolbar/ToolbarButton.js +2 -2
  125. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  126. package/build/esm/toolbar/types.d.ts +1 -0
  127. package/build/esm/toolbar/types.js.map +1 -1
  128. package/build/esm/types/node-view.d.ts +11 -0
  129. package/build/esm/types/node-view.js +2 -0
  130. package/build/esm/types/node-view.js.map +1 -0
  131. package/build/esm/utils/truthy.d.ts +4 -0
  132. package/build/esm/utils/truthy.js +7 -0
  133. package/build/esm/utils/truthy.js.map +1 -0
  134. package/build/esm/version.js +1 -1
  135. package/build/esm/version.js.map +1 -1
  136. package/build/esm/view/hocs/index.d.ts +1 -0
  137. package/build/esm/view/hocs/index.js +2 -0
  138. package/build/esm/view/hocs/index.js.map +1 -0
  139. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  140. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
  141. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  142. package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  143. package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
  144. package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
  145. package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
  146. package/build/esm/view/index.d.ts +1 -0
  147. package/build/esm/view/index.js +1 -0
  148. package/build/esm/view/index.js.map +1 -1
  149. package/build/styles.css +46 -10
  150. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { Plugin } from 'prosemirror-state';
2
1
  import { type Parser, type Serializer } from "../../../core/index.js";
2
+ import { Plugin } from "../../../pm/state.js";
3
3
  import { type Logger2 } from "../../../logger.js";
4
4
  import "../../../types/spec.js";
5
5
  export type ClipboardPluginOptions = {
@@ -1,18 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.clipboard = void 0;
4
- const prosemirror_model_1 = require("prosemirror-model");
5
- const prosemirror_state_1 = require("prosemirror-state");
6
- const core_1 = require("../../../core/index.js");
4
+ const _core_1 = require("../../../core/index.js");
5
+ const model_1 = require("../../../pm/model.js");
6
+ const state_1 = require("../../../pm/state.js");
7
7
  const logger_1 = require("../../../logger.js");
8
8
  require("../../../types/spec.js");
9
9
  const helpers_1 = require("../../../utils/helpers.js");
10
10
  const selection_1 = require("../../../utils/selection.js");
11
11
  const BaseSchema_1 = require("../../base/BaseSchema/index.js");
12
12
  const code_1 = require("./code.js");
13
+ const trim_selection_1 = require("./trim-selection.js");
13
14
  const utils_1 = require("./utils.js");
14
15
  const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
15
- return new prosemirror_state_1.Plugin({
16
+ return new state_1.Plugin({
16
17
  props: {
17
18
  handleDOMEvents: {
18
19
  copy(view, e) {
@@ -53,9 +54,9 @@ const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler,
53
54
  if ((0, utils_1.isIosSafariShare)(e.clipboardData) &&
54
55
  (data = e.clipboardData.getData(utils_1.DataTransferType.UriList))) {
55
56
  const schema = view.state.schema;
56
- view.dispatch((0, core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(
57
+ view.dispatch((0, _core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(
57
58
  // paste link inline
58
- new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from((0, BaseSchema_1.pType)(schema).create(null, schema.text(data))), 1, 1)), 'paste', { clipboardDataFormat: utils_1.DataTransferType.UriList }));
59
+ new model_1.Slice(model_1.Fragment.from((0, BaseSchema_1.pType)(schema).create(null, schema.text(data))), 1, 1)), 'paste', { clipboardDataFormat: utils_1.DataTransferType.UriList }));
59
60
  pasteLogger.event({
60
61
  event: 'paste-uri-list',
61
62
  });
@@ -71,7 +72,7 @@ const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler,
71
72
  if (res.success) {
72
73
  const docNode = res.result;
73
74
  const slice = getSliceFromMarkupFragment(docNode.content);
74
- view.dispatch((0, core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: utils_1.DataTransferType.Html }));
75
+ view.dispatch((0, _core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: utils_1.DataTransferType.Html }));
75
76
  pasteLogger.event({
76
77
  event: 'paste-parsed-html',
77
78
  });
@@ -109,7 +110,7 @@ const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler,
109
110
  event: 'paste-text-to-code',
110
111
  codeType,
111
112
  });
112
- view.dispatch((0, core_1.trackTransactionMetrics)(view.state.tr.replaceSelectionWith(schema.text(codeType === 'inline'
113
+ view.dispatch((0, _core_1.trackTransactionMetrics)(view.state.tr.replaceSelectionWith(schema.text(codeType === 'inline'
113
114
  ? insideCodeData.trim()
114
115
  : insideCodeData)), 'paste', { clipboardDataFormat: utils_1.DataTransferType.Text, code: codeType }));
115
116
  isPasteHandled = true;
@@ -123,7 +124,7 @@ const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler,
123
124
  event: 'paste-parsed-content',
124
125
  dataFormat,
125
126
  });
126
- view.dispatch((0, core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: dataFormat }));
127
+ view.dispatch((0, _core_1.trackTransactionMetrics)(view.state.tr.replaceSelection(slice), 'paste', { clipboardDataFormat: dataFormat }));
127
128
  isPasteHandled = true;
128
129
  }
129
130
  else {
@@ -165,12 +166,13 @@ function getSliceFromMarkupFragment(fragment) {
165
166
  end = 1;
166
167
  }
167
168
  }
168
- return new prosemirror_model_1.Slice(fragment, start, end);
169
+ return new model_1.Slice(fragment, start, end);
169
170
  }
170
171
  function serializeSelected(view, serializer) {
171
172
  const sel = view.state.selection;
172
173
  if (sel.empty)
173
174
  return null;
175
+ // handle selection in codeblocks
174
176
  if (getSharedDepthNode(sel).type.spec.code) {
175
177
  const fragment = sel.content().content;
176
178
  return { text: fragment.textBetween(0, fragment.size) };
@@ -189,26 +191,23 @@ function setClipboardData(data, result) {
189
191
  data.setData(utils_1.DataTransferType.Text, result.text);
190
192
  }
191
193
  function getCopyContent(state) {
192
- const sel = state.selection;
194
+ let sel = state.selection;
193
195
  if ((0, selection_1.isWholeSelection)(sel)) {
194
- return new prosemirror_model_1.Slice(state.doc.content, 0, 0);
195
- }
196
- if (isTextSelectionWithinSameTextBlock(sel)) {
197
- return new prosemirror_model_1.Slice(createFragmentFromInlineSelection(state), 0, 0);
196
+ return new model_1.Slice(state.doc.content, 0, 0);
198
197
  }
199
198
  if ((0, selection_1.isNodeSelection)(sel)) {
200
199
  const { node } = sel;
201
200
  if (node.type.spec.complex) {
202
201
  if (node.isTextblock) {
203
- return new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from(state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, node.content)), 1, 1);
202
+ return new model_1.Slice(model_1.Fragment.from(state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, node.content)), 1, 1);
204
203
  }
205
204
  else {
206
205
  const { complex } = node.type.spec;
207
206
  if (complex === 'root') {
208
- return new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from(node), 1, 1);
207
+ return new model_1.Slice(model_1.Fragment.from(node), 1, 1);
209
208
  }
210
209
  else if (complex === 'leaf') {
211
- return new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from(node.content), 1, 1);
210
+ return new model_1.Slice(model_1.Fragment.from(node.content), 1, 1);
212
211
  }
213
212
  else {
214
213
  // TODO: handle copy of intermediate complex block node
@@ -216,9 +215,15 @@ function getCopyContent(state) {
216
215
  }
217
216
  }
218
217
  else {
219
- return new prosemirror_model_1.Slice(prosemirror_model_1.Fragment.from(node), 1, 1);
218
+ return new model_1.Slice(model_1.Fragment.from(node), 1, 1);
220
219
  }
221
220
  }
221
+ if ((0, selection_1.isTextSelection)(sel)) {
222
+ sel = (0, trim_selection_1.trimTextSelection)(sel);
223
+ }
224
+ if (isTextSelectionWithinSameTextBlock(sel)) {
225
+ return new model_1.Slice(createFragmentFromInlineSelection(state, sel), 0, 0);
226
+ }
222
227
  let slice = getSelectionContent(sel);
223
228
  // replace first node with paragraph if needed
224
229
  if (slice.content.firstChild?.isTextblock &&
@@ -230,15 +235,15 @@ function getCopyContent(state) {
230
235
  shouldTransformFirstChildToPara = false;
231
236
  }
232
237
  if (shouldTransformFirstChildToPara) {
233
- slice = new prosemirror_model_1.Slice(slice.content.replaceChild(0, state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, firstChild.content)), slice.openStart, slice.openStart);
238
+ slice = new model_1.Slice(slice.content.replaceChild(0, state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, firstChild.content)), slice.openStart, slice.openStart);
234
239
  }
235
240
  }
236
241
  else {
237
242
  // trim empty list items
238
- const createEmptyParagraph = () => prosemirror_model_1.Fragment.from((0, BaseSchema_1.pType)(state.schema).createAndFill());
243
+ const createEmptyParagraph = () => model_1.Fragment.from((0, BaseSchema_1.pType)(state.schema).createAndFill());
239
244
  const trimmedContent = (0, utils_1.trimContent)(slice.content, createEmptyParagraph);
240
245
  if (trimmedContent !== slice.content) {
241
- slice = new prosemirror_model_1.Slice(trimmedContent, 1, 1);
246
+ slice = new model_1.Slice(trimmedContent, 1, 1);
242
247
  }
243
248
  }
244
249
  return slice;
@@ -246,17 +251,16 @@ function getCopyContent(state) {
246
251
  function isTextSelectionWithinSameTextBlock(sel) {
247
252
  return (0, selection_1.isTextSelection)(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;
248
253
  }
249
- function createFragmentFromInlineSelection(state) {
250
- const sel = state.selection;
254
+ function createFragmentFromInlineSelection(state, sel) {
251
255
  const inlineSlice = state.doc.slice(sel.from, sel.to);
252
256
  const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);
253
257
  const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);
254
258
  if (isComplexTextblock || !isAllContentSelected) {
255
259
  // copy selected inline content to paragraph if current node is complex
256
260
  // or if only part of it's content was selected
257
- return prosemirror_model_1.Fragment.from(state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, inlineSlice.content));
261
+ return model_1.Fragment.from(state.schema.node(BaseSchema_1.BaseNode.Paragraph, {}, inlineSlice.content));
258
262
  }
259
- return prosemirror_model_1.Fragment.from(sel.$from.parent.copy(inlineSlice.content));
263
+ return model_1.Fragment.from(sel.$from.parent.copy(inlineSlice.content));
260
264
  }
261
265
  /**
262
266
  * Like `selection.content()`, but smarter.
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type ResolvedPos, type Schema, Slice} from 'prosemirror-model';\nimport {type EditorState, Plugin, type Selection} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Parser, type Serializer, trackTransactionMetrics} from '../../../core';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport '../../../types/spec';\nimport {tryCatch} from '../../../utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from '../../../utils/selection';\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n const sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state), 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState) {\n const sel = state.selection;\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.trimTextSelection = trimTextSelection;
4
+ exports.trimTextSelectionOnEdge = trimTextSelectionOnEdge;
5
+ const state_1 = require("../../../pm/state.js");
6
+ /** @internal */
7
+ function trimTextSelection(sel) {
8
+ const { $from, $to } = sel;
9
+ const from = trimTextSelectionOnEdge($from, 'forward');
10
+ const to = trimTextSelectionOnEdge($to, 'backward');
11
+ if ($from.pos === from && $to.pos === to)
12
+ return sel;
13
+ if (from > to)
14
+ return state_1.TextSelection.create($from.doc, to, to);
15
+ return state_1.TextSelection.create($from.doc, from, to);
16
+ }
17
+ /** @internal */
18
+ function trimTextSelectionOnEdge($pos, dir) {
19
+ let depth = $pos.depth;
20
+ let isAtTextblockEdge = true;
21
+ {
22
+ const edgePos = dir === 'forward' ? $pos.end() : $pos.start();
23
+ isAtTextblockEdge = $pos.pos === edgePos;
24
+ }
25
+ if (isAtTextblockEdge && !$pos.parent.isTextblock) {
26
+ while (depth > 0) {
27
+ const node = $pos.node(depth);
28
+ const parentNode = $pos.node(depth - 1);
29
+ if (node.isTextblock) {
30
+ break;
31
+ }
32
+ const edgeNode = dir === 'forward' ? parentNode.lastChild : parentNode.firstChild;
33
+ if (node !== edgeNode) {
34
+ isAtTextblockEdge = false;
35
+ break;
36
+ }
37
+ depth--;
38
+ }
39
+ }
40
+ if (!isAtTextblockEdge || depth < 1 || !$pos.node(depth).isTextblock) {
41
+ return $pos.pos;
42
+ }
43
+ while (depth > 0) {
44
+ const node = $pos.node(depth);
45
+ const parentNode = $pos.node(depth - 1);
46
+ const edgeNode = dir === 'forward' ? parentNode.lastChild : parentNode.firstChild;
47
+ if (node !== edgeNode)
48
+ break;
49
+ depth--;
50
+ }
51
+ const newPos = dir === 'forward' ? $pos.after(depth) : $pos.before(depth);
52
+ const sel = state_1.TextSelection.findFrom($pos.doc.resolve(newPos), dir === 'forward' ? 1 : -1);
53
+ return sel?.anchor ?? $pos.pos;
54
+ }
55
+ //# sourceMappingURL=trim-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-selection.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/trim-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedPos} from '#pm/model';\nimport {TextSelection} from '#pm/state';\n\n/** @internal */\nexport function trimTextSelection(sel: TextSelection): TextSelection {\n const {$from, $to} = sel;\n const from = trimTextSelectionOnEdge($from, 'forward');\n const to = trimTextSelectionOnEdge($to, 'backward');\n if ($from.pos === from && $to.pos === to) return sel;\n if (from > to) return TextSelection.create($from.doc, to, to);\n return TextSelection.create($from.doc, from, to);\n}\n\n/** @internal */\nexport function trimTextSelectionOnEdge($pos: ResolvedPos, dir: 'backward' | 'forward'): number {\n let depth = $pos.depth;\n let isAtTextblockEdge = true;\n\n {\n const edgePos = dir === 'forward' ? $pos.end() : $pos.start();\n isAtTextblockEdge = $pos.pos === edgePos;\n }\n\n if (isAtTextblockEdge && !$pos.parent.isTextblock) {\n while (depth > 0) {\n const node = $pos.node(depth);\n const parentNode = $pos.node(depth - 1);\n\n if (node.isTextblock) {\n break;\n }\n\n const edgeNode = dir === 'forward' ? parentNode.lastChild : parentNode.firstChild;\n if (node !== edgeNode) {\n isAtTextblockEdge = false;\n break;\n }\n\n depth--;\n }\n }\n\n if (!isAtTextblockEdge || depth < 1 || !$pos.node(depth).isTextblock) {\n return $pos.pos;\n }\n\n while (depth > 0) {\n const node = $pos.node(depth);\n const parentNode = $pos.node(depth - 1);\n\n const edgeNode = dir === 'forward' ? parentNode.lastChild : parentNode.firstChild;\n if (node !== edgeNode) break;\n\n depth--;\n }\n\n const newPos = dir === 'forward' ? $pos.after(depth) : $pos.before(depth);\n const sel = TextSelection.findFrom($pos.doc.resolve(newPos), dir === 'forward' ? 1 : -1);\n return sel?.anchor ?? $pos.pos;\n}\n"]}
@@ -1,8 +1,21 @@
1
- .yfm.ProseMirror .hljs.show-line-numbers {
2
- display: flex;
1
+ .g-md-editor.ProseMirror.yfm pre > code {
3
2
  white-space: pre;
4
3
  }
5
-
6
- .yfm.ProseMirror pre > code > .yfm-line-numbers > .yfm-line-number {
7
- display: block;
4
+ .g-md-editor.ProseMirror pre > code.wrap {
5
+ /* stylelint-disable */
6
+ white-space: pre-wrap;
7
+ white-space: break-spaces;
8
+ /* stylelint-enable */
9
+ }
10
+ .g-md-editor.ProseMirror pre > code.wrap .yfm-line-number.ProseMirror-widget {
11
+ position: absolute;
12
+ left: 16px;
13
+ padding: 0;
14
+ }
15
+ .g-md-editor.ProseMirror pre > code.show-line-numbers {
16
+ position: relative;
17
+ display: flex;
18
+ }
19
+ .g-md-editor.ProseMirror pre > code .fake-line-number {
20
+ opacity: 0;
8
21
  }
@@ -4,6 +4,9 @@ import { type LineNumbersOptions } from "../CodeBlockSpecs/index.js";
4
4
  import "./CodeBlockHighlight.css";
5
5
  export type HighlightLangMap = Options['highlightLangs'];
6
6
  export type CodeBlockHighlightOptions = {
7
+ lineWrapping?: {
8
+ enabled?: boolean;
9
+ };
7
10
  lineNumbers?: LineNumbersOptions;
8
11
  langs?: HighlightLangMap;
9
12
  };
@@ -8,7 +8,11 @@ const prosemirror_view_1 = require("prosemirror-view");
8
8
  const lodash_1 = require("../../../../lodash.js");
9
9
  const logger_1 = require("../../../../logger.js");
10
10
  const CodeBlockSpecs_1 = require("../CodeBlockSpecs/index.js");
11
+ const CodeBlockNodeView_1 = require("./CodeBlockNodeView.js");
11
12
  const TooltipPlugin_1 = require("./TooltipPlugin/index.js");
13
+ const const_1 = require("./const.js");
14
+ const codeBlockLineNumbersPlugin_1 = require("./plugins/codeBlockLineNumbersPlugin.js");
15
+ const codeBlockLineWrappingPlugin_1 = require("./plugins/codeBlockLineWrappingPlugin.js");
12
16
  require("./CodeBlockHighlight.css");
13
17
  const key = new prosemirror_state_1.PluginKey('code_block_highlight');
14
18
  const CodeBlockHighlight = (builder, opts) => {
@@ -31,9 +35,14 @@ const CodeBlockHighlight = (builder, opts) => {
31
35
  return false;
32
36
  }
33
37
  };
38
+ if (opts.lineWrapping?.enabled)
39
+ builder.addPlugin(codeBlockLineWrappingPlugin_1.codeBlockLineWrappingPlugin);
40
+ if (opts.lineNumbers?.enabled)
41
+ builder.addPlugin(codeBlockLineNumbersPlugin_1.codeBlockLineNumbersPlugin);
34
42
  builder.addPlugin(() => {
35
43
  let modulesLoaded = false;
36
44
  let view = null;
45
+ // empty array by default, but is filled after loading modules
37
46
  const selectItems = [];
38
47
  const mapping = {};
39
48
  // TODO: add TAB key handler
@@ -57,6 +66,7 @@ const CodeBlockHighlight = (builder, opts) => {
57
66
  }
58
67
  }
59
68
  }
69
+ selectItems.sort(sortLangs);
60
70
  if (view && !view.isDestroyed) {
61
71
  view.dispatch(view.state.tr.setMeta(key, { modulesLoaded }));
62
72
  }
@@ -103,58 +113,17 @@ const CodeBlockHighlight = (builder, opts) => {
103
113
  },
104
114
  view: (v) => {
105
115
  view = v;
106
- return (0, TooltipPlugin_1.codeLangSelectTooltipViewCreator)(view, selectItems, mapping, Boolean(opts.lineNumbers?.enabled));
116
+ return (0, TooltipPlugin_1.codeLangSelectTooltipViewCreator)(view, selectItems, mapping, {
117
+ showCodeWrapping: Boolean(opts.lineWrapping?.enabled),
118
+ showLineNumbers: Boolean(opts.lineNumbers?.enabled),
119
+ });
107
120
  },
108
121
  props: {
109
122
  decorations: (state) => {
110
123
  return key.getState(state);
111
124
  },
112
125
  nodeViews: {
113
- [CodeBlockSpecs_1.codeBlockNodeName]: (node) => {
114
- let prevLang = node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.Lang];
115
- const dom = document.createElement('pre');
116
- updateDomAttribute(dom, CodeBlockSpecs_1.CodeBlockNodeAttr.Line, node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.Line]);
117
- const code = document.createElement('code');
118
- code.classList.add('hljs');
119
- if (prevLang) {
120
- dom.setAttribute(CodeBlockSpecs_1.CodeBlockNodeAttr.Lang, prevLang);
121
- code.classList.add(prevLang);
122
- }
123
- const contentDOM = document.createElement('div');
124
- let lineNumbersContainer;
125
- let prevLineCount = 0;
126
- if (opts.lineNumbers?.enabled) {
127
- const result = manageLineNumbers(node, code);
128
- lineNumbersContainer = result.container;
129
- prevLineCount = result.lineCount;
130
- }
131
- code.append(contentDOM);
132
- dom.append(code);
133
- return {
134
- dom,
135
- contentDOM,
136
- update(newNode) {
137
- if (node.type !== newNode.type)
138
- return false;
139
- const newLang = newNode.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.Lang];
140
- if (prevLang !== newLang) {
141
- code.className = 'hljs';
142
- updateDomAttribute(dom, CodeBlockSpecs_1.CodeBlockNodeAttr.Lang, newLang);
143
- if (newLang) {
144
- code.classList.add(newLang);
145
- }
146
- prevLang = newLang;
147
- }
148
- updateDomAttribute(dom, CodeBlockSpecs_1.CodeBlockNodeAttr.Line, newNode.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.Line]);
149
- if (opts.lineNumbers?.enabled) {
150
- const result = manageLineNumbers(newNode, code, lineNumbersContainer, prevLineCount);
151
- lineNumbersContainer = result.container;
152
- prevLineCount = result.lineCount;
153
- }
154
- return true;
155
- },
156
- };
157
- },
126
+ [CodeBlockSpecs_1.codeBlockNodeName]: CodeBlockNodeView_1.CodeBlockNodeView.withOpts(opts),
158
127
  },
159
128
  },
160
129
  });
@@ -207,58 +176,12 @@ function stepHasFromTo(step) {
207
176
  // @ts-expect-error
208
177
  return typeof step.from === 'number' && typeof step.to === 'number';
209
178
  }
210
- function updateDomAttribute(elem, attr, value) {
211
- if (value) {
212
- elem.setAttribute(attr, value);
213
- }
214
- else {
215
- elem.removeAttribute(attr);
216
- }
217
- }
218
- function manageLineNumbers(node, code, prevContainer, prevLineCount = 0) {
219
- const showLineNumbers = node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers] === 'true';
220
- if (!showLineNumbers) {
221
- if (prevContainer) {
222
- code.removeChild(prevContainer);
223
- code.classList.remove('show-line-numbers');
224
- }
225
- return { container: undefined, lineCount: 0 };
226
- }
227
- const lines = node.textContent ? node.textContent.split('\n') : [''];
228
- const currentLineCount = lines.length;
229
- let container = prevContainer;
230
- if (!container) {
231
- container = document.createElement('div');
232
- container.className = 'yfm-line-numbers';
233
- container.contentEditable = 'false';
234
- code.prepend(container);
235
- }
236
- code.classList.add('show-line-numbers');
237
- if (currentLineCount !== prevLineCount) {
238
- const maxDigits = String(currentLineCount).length;
239
- const prevMaxDigits = String(prevLineCount).length;
240
- if (currentLineCount > prevLineCount) {
241
- for (let i = prevLineCount + 1; i <= currentLineCount; i++) {
242
- const lineNumberElement = document.createElement('div');
243
- lineNumberElement.className = 'yfm-line-number';
244
- lineNumberElement.textContent = String(i).padStart(maxDigits, ' ');
245
- container.appendChild(lineNumberElement);
246
- }
247
- }
248
- else if (currentLineCount < prevLineCount) {
249
- for (let i = prevLineCount; i > currentLineCount; i--) {
250
- if (container.lastChild) {
251
- container.removeChild(container.lastChild);
252
- }
253
- }
254
- }
255
- if (maxDigits !== prevMaxDigits) {
256
- Array.from(container.children).forEach((lineNumber, index) => {
257
- const lineNum = index + 1;
258
- lineNumber.textContent = String(lineNum).padStart(maxDigits, ' ');
259
- });
260
- }
261
- }
262
- return { container, lineCount: currentLineCount };
179
+ function sortLangs(a, b) {
180
+ // plaintext always goes first
181
+ if (a.value === const_1.PlainTextLang)
182
+ return -1;
183
+ if (b.value === const_1.PlainTextLang)
184
+ return 1;
185
+ return 0;
263
186
  }
264
187
  //# sourceMappingURL=CodeBlockHighlight.js.map