@gravity-ui/markdown-editor 15.31.0 → 15.33.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 (158) hide show
  1. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  2. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  3. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  4. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  5. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  6. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
  7. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  8. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  9. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  10. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
  11. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  12. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  13. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
  14. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  15. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  16. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
  17. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
  20. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  21. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  22. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
  23. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  24. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  25. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
  26. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  27. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  28. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js +6 -12
  30. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
  31. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
  32. package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
  33. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  34. package/build/cjs/extensions/yfm/YfmTable/paste.d.ts +1 -0
  35. package/build/cjs/extensions/yfm/YfmTable/paste.js +28 -0
  36. package/build/cjs/extensions/yfm/YfmTable/paste.js.map +1 -1
  37. package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +3 -1
  38. package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
  39. package/build/cjs/i18n/codeblock/en.json +1 -0
  40. package/build/cjs/i18n/codeblock/index.d.ts +2 -1
  41. package/build/cjs/i18n/codeblock/ru.json +1 -0
  42. package/build/cjs/i18n/viewer/en.json +3 -0
  43. package/build/cjs/i18n/viewer/index.d.ts +5 -0
  44. package/build/cjs/i18n/viewer/index.js +10 -0
  45. package/build/cjs/i18n/viewer/index.js.map +1 -0
  46. package/build/cjs/i18n/viewer/ru.json +3 -0
  47. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
  48. package/build/cjs/plugins/BaseTooltip/index.js +1 -1
  49. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  50. package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
  51. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  52. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  53. package/build/cjs/toolbar/types.d.ts +1 -0
  54. package/build/cjs/toolbar/types.js.map +1 -1
  55. package/build/cjs/types/node-view.d.ts +11 -0
  56. package/build/cjs/types/node-view.js +3 -0
  57. package/build/cjs/types/node-view.js.map +1 -0
  58. package/build/cjs/utils/clipboard.d.ts +1 -0
  59. package/build/cjs/utils/clipboard.js +7 -0
  60. package/build/cjs/utils/clipboard.js.map +1 -1
  61. package/build/cjs/utils/truthy.d.ts +4 -0
  62. package/build/cjs/utils/truthy.js +11 -0
  63. package/build/cjs/utils/truthy.js.map +1 -0
  64. package/build/cjs/version.js +1 -1
  65. package/build/cjs/version.js.map +1 -1
  66. package/build/cjs/view/hocs/index.d.ts +1 -0
  67. package/build/cjs/view/hocs/index.js +5 -0
  68. package/build/cjs/view/hocs/index.js.map +1 -0
  69. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  70. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
  71. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  72. package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  73. package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
  74. package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
  75. package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
  76. package/build/cjs/view/index.d.ts +1 -0
  77. package/build/cjs/view/index.js +1 -0
  78. package/build/cjs/view/index.js.map +1 -1
  79. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  80. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  81. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  82. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  84. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
  85. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  86. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  87. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  88. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
  89. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  90. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  91. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
  92. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  93. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  94. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
  95. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  96. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  97. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
  98. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  99. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  100. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
  101. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  102. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  103. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
  104. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  105. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  106. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  107. package/build/esm/extensions/markdown/CodeBlock/handle-paste.js +7 -13
  108. package/build/esm/extensions/markdown/CodeBlock/handle-paste.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/extensions/yfm/YfmTable/paste.d.ts +1 -0
  113. package/build/esm/extensions/yfm/YfmTable/paste.js +28 -1
  114. package/build/esm/extensions/yfm/YfmTable/paste.js.map +1 -1
  115. package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +4 -2
  116. package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
  117. package/build/esm/i18n/codeblock/en.json +1 -0
  118. package/build/esm/i18n/codeblock/index.d.ts +2 -1
  119. package/build/esm/i18n/codeblock/ru.json +1 -0
  120. package/build/esm/i18n/viewer/en.json +3 -0
  121. package/build/esm/i18n/viewer/index.d.ts +5 -0
  122. package/build/esm/i18n/viewer/index.js +6 -0
  123. package/build/esm/i18n/viewer/index.js.map +1 -0
  124. package/build/esm/i18n/viewer/ru.json +3 -0
  125. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
  126. package/build/esm/plugins/BaseTooltip/index.js +1 -1
  127. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  128. package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
  129. package/build/esm/toolbar/ToolbarButton.js +2 -2
  130. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  131. package/build/esm/toolbar/types.d.ts +1 -0
  132. package/build/esm/toolbar/types.js.map +1 -1
  133. package/build/esm/types/node-view.d.ts +11 -0
  134. package/build/esm/types/node-view.js +2 -0
  135. package/build/esm/types/node-view.js.map +1 -0
  136. package/build/esm/utils/clipboard.d.ts +1 -0
  137. package/build/esm/utils/clipboard.js +6 -0
  138. package/build/esm/utils/clipboard.js.map +1 -1
  139. package/build/esm/utils/truthy.d.ts +4 -0
  140. package/build/esm/utils/truthy.js +7 -0
  141. package/build/esm/utils/truthy.js.map +1 -0
  142. package/build/esm/version.js +1 -1
  143. package/build/esm/version.js.map +1 -1
  144. package/build/esm/view/hocs/index.d.ts +1 -0
  145. package/build/esm/view/hocs/index.js +2 -0
  146. package/build/esm/view/hocs/index.js.map +1 -0
  147. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  148. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
  149. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  150. package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  151. package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
  152. package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
  153. package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
  154. package/build/esm/view/index.d.ts +1 -0
  155. package/build/esm/view/index.js +1 -0
  156. package/build/esm/view/index.js.map +1 -1
  157. package/build/styles.css +46 -10
  158. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export const PlainTextLang = 'plaintext';
2
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC","sourcesContent":["export const PlainTextLang = 'plaintext';\n"]}
@@ -0,0 +1,51 @@
1
+ import { Plugin, PluginKey } from "../../../../../pm/state.js";
2
+ import { findChildrenByType } from "../../../../../pm/utils.js";
3
+ import { Decoration, DecorationSet } from "../../../../../pm/view.js";
4
+ import { codeBlockType } from "../../CodeBlockSpecs/index.js";
5
+ import { isLineNumbersVisible } from "../utils.js";
6
+ const pluginKey = new PluginKey('code_block_line_numbers_decorations');
7
+ /** @internal */
8
+ export const codeBlockLineNumbersPlugin = () => {
9
+ return new Plugin({
10
+ key: pluginKey,
11
+ state: {
12
+ init(_config, state) {
13
+ return getDecorations(state.doc);
14
+ },
15
+ apply(tr, decos) {
16
+ if (tr.docChanged) {
17
+ return getDecorations(tr.doc);
18
+ }
19
+ return decos.map(tr.mapping, tr.doc);
20
+ },
21
+ },
22
+ props: {
23
+ decorations(state) {
24
+ return pluginKey.getState(state);
25
+ },
26
+ },
27
+ });
28
+ };
29
+ function getDecorations(doc) {
30
+ const decos = [];
31
+ for (const { node, pos } of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {
32
+ if (!isLineNumbersVisible(node))
33
+ continue;
34
+ const codeContent = node.textContent;
35
+ const contentByLines = codeContent.split('\n');
36
+ const maxDigits = String(contentByLines.length).length;
37
+ let shift = 0;
38
+ for (let i = 0; i < contentByLines.length; i++) {
39
+ const line = contentByLines[i];
40
+ {
41
+ const elem = document.createElement('span');
42
+ elem.classList.add('yfm-line-number');
43
+ elem.textContent = String(i + 1).padStart(maxDigits, ' ');
44
+ decos.push(Decoration.widget(pos + shift + 1, elem, { side: 1, ignoreSelection: true }));
45
+ }
46
+ shift += line.length + 1;
47
+ }
48
+ }
49
+ return DecorationSet.create(doc, decos);
50
+ }
51
+ //# sourceMappingURL=codeBlockLineNumbersPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeBlockLineNumbersPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,mCAAkB;AAC5C,OAAO,EAAC,kBAAkB,EAAC,mCAAkB;AAC7C,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,kCAAiB;AAEnD,OAAO,EAAC,aAAa,EAAC,sCAA6B;AACnD,OAAO,EAAC,oBAAoB,EAAC,oBAAiB;AAE9C,MAAM,SAAS,GAAG,IAAI,SAAS,CAAgB,qCAAqC,CAAC,CAAC;AAEtF,gBAAgB;AAChB,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC3C,OAAO,IAAI,MAAM,CAAgB;QAC7B,GAAG,EAAE,SAAS;QACd,KAAK,EAAE;YACH,IAAI,CAAC,OAAO,EAAE,KAAK;gBACf,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,CAAC,EAAE,EAAE,KAAK;gBACX,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBAED,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;SACJ;QACD,KAAK,EAAE;YACH,WAAW,CAAC,KAAK;gBACb,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,SAAS,cAAc,CAAC,GAAS;IAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAEvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAE/B,CAAC;gBACG,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAE1D,KAAK,CAAC,IAAI,CACN,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAC,CAAC,CAC7E,CAAC;YACN,CAAC;YAED,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import type {Node} from '#pm/model';\nimport {Plugin, PluginKey} from '#pm/state';\nimport {findChildrenByType} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\nimport {isLineNumbersVisible} from '../utils';\n\nconst pluginKey = new PluginKey<DecorationSet>('code_block_line_numbers_decorations');\n\n/** @internal */\nexport const codeBlockLineNumbersPlugin = () => {\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config, state) {\n return getDecorations(state.doc);\n },\n apply(tr, decos) {\n if (tr.docChanged) {\n return getDecorations(tr.doc);\n }\n\n return decos.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state);\n },\n },\n });\n};\n\nfunction getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n if (!isLineNumbersVisible(node)) continue;\n\n const codeContent = node.textContent;\n const contentByLines = codeContent.split('\\n');\n\n const maxDigits = String(contentByLines.length).length;\n\n let shift = 0;\n for (let i = 0; i < contentByLines.length; i++) {\n const line = contentByLines[i];\n\n {\n const elem = document.createElement('span');\n elem.classList.add('yfm-line-number');\n elem.textContent = String(i + 1).padStart(maxDigits, ' ');\n\n decos.push(\n Decoration.widget(pos + shift + 1, elem, {side: 1, ignoreSelection: true}),\n );\n }\n\n shift += line.length + 1;\n }\n }\n\n return DecorationSet.create(doc, decos);\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { Plugin, PluginKey } from "../../../../../pm/state.js";
2
+ import { Decoration, DecorationSet } from "../../../../../pm/view.js";
3
+ import { codeBlockType } from "../../CodeBlockSpecs/index.js";
4
+ const pluginKey = new PluginKey('code_block_line_wrapping');
5
+ const WRAPPING_SPEC_KEY = '__code_block_line_wrapping';
6
+ const WRAPPING_SPEC_VALUE = true;
7
+ const isLineWrappingDecoration = (deco) => deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;
8
+ /** @internal */
9
+ export const hasLineWrappingDecoration = (decorations) => {
10
+ return decorations.some(isLineWrappingDecoration);
11
+ };
12
+ /** @internal */
13
+ export const isNodeHasLineWrapping = (state, pos) => {
14
+ const node = state.doc.nodeAt(pos);
15
+ if (!node || node.type !== codeBlockType(state.doc.type.schema))
16
+ return false;
17
+ const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);
18
+ return decos?.some(isLineWrappingDecoration) ?? false;
19
+ };
20
+ /** @internal */
21
+ export function enableLineWrapping(tr, pos) {
22
+ return tr.setMeta(pluginKey, { type: 'add', pos });
23
+ }
24
+ /** @internal */
25
+ export function disableLineWrapping(tr, pos) {
26
+ return tr.setMeta(pluginKey, { type: 'remove', pos });
27
+ }
28
+ /** @internal */
29
+ export const codeBlockLineWrappingPlugin = () => {
30
+ return new Plugin({
31
+ key: pluginKey,
32
+ state: {
33
+ init() {
34
+ return {
35
+ decorations: DecorationSet.empty,
36
+ };
37
+ },
38
+ apply(tr, value) {
39
+ let decorations = value.decorations.map(tr.mapping, tr.doc);
40
+ if (tr.getMeta(pluginKey)) {
41
+ const meta = tr.getMeta(pluginKey);
42
+ if (meta.type === 'add') {
43
+ const node = tr.doc.nodeAt(meta.pos);
44
+ if (node?.type === codeBlockType(tr.doc.type.schema)) {
45
+ const from = meta.pos;
46
+ const to = meta.pos + node.nodeSize;
47
+ decorations = decorations.add(tr.doc, [
48
+ Decoration.node(from, to, {}, { [WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE }),
49
+ ]);
50
+ }
51
+ }
52
+ else if (meta.type === 'remove') {
53
+ const node = tr.doc.nodeAt(meta.pos);
54
+ if (node?.type === codeBlockType(tr.doc.type.schema)) {
55
+ const start = meta.pos + 1;
56
+ const end = meta.pos + node.nodeSize - 1;
57
+ const found = decorations.find(start, end);
58
+ decorations = decorations.remove(found);
59
+ }
60
+ }
61
+ }
62
+ return { decorations };
63
+ },
64
+ },
65
+ props: {
66
+ decorations(state) {
67
+ return pluginKey.getState(state)?.decorations;
68
+ },
69
+ },
70
+ });
71
+ };
72
+ //# sourceMappingURL=codeBlockLineWrappingPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeBlockLineWrappingPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {type EditorState, Plugin, PluginKey, type Transaction} from '#pm/state';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\n\ntype StateShape = {\n decorations: DecorationSet;\n};\n\nconst pluginKey = new PluginKey<StateShape>('code_block_line_wrapping');\n\ntype Meta = {\n type: 'add' | 'remove';\n pos: number;\n};\n\nconst WRAPPING_SPEC_KEY = '__code_block_line_wrapping';\nconst WRAPPING_SPEC_VALUE = true;\n\nconst isLineWrappingDecoration = (deco: Decoration) =>\n deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;\n\n/** @internal */\nexport const hasLineWrappingDecoration = (decorations: readonly Decoration[]): boolean => {\n return decorations.some(isLineWrappingDecoration);\n};\n\n/** @internal */\nexport const isNodeHasLineWrapping = (state: EditorState, pos: number): boolean => {\n const node = state.doc.nodeAt(pos);\n if (!node || node.type !== codeBlockType(state.doc.type.schema)) return false;\n const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);\n return decos?.some(isLineWrappingDecoration) ?? false;\n};\n\n/** @internal */\nexport function enableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'add', pos} satisfies Meta);\n}\n\n/** @internal */\nexport function disableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'remove', pos} satisfies Meta);\n}\n\n/** @internal */\nexport const codeBlockLineWrappingPlugin = () => {\n return new Plugin<StateShape>({\n key: pluginKey,\n state: {\n init() {\n return {\n decorations: DecorationSet.empty,\n };\n },\n apply(tr, value) {\n let decorations = value.decorations.map(tr.mapping, tr.doc);\n\n if (tr.getMeta(pluginKey)) {\n const meta = tr.getMeta(pluginKey) as Meta;\n\n if (meta.type === 'add') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const from = meta.pos;\n const to = meta.pos + node.nodeSize;\n decorations = decorations.add(tr.doc, [\n Decoration.node(\n from,\n to,\n {},\n {[WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE},\n ),\n ]);\n }\n } else if (meta.type === 'remove') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const start = meta.pos + 1;\n const end = meta.pos + node.nodeSize - 1;\n const found = decorations.find(start, end);\n decorations = decorations.remove(found);\n }\n }\n }\n\n return {decorations};\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state)?.decorations;\n },\n },\n });\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { CodeBlockNodeAttr } from "../CodeBlockSpecs/index.js";
2
+ /** @internal */
3
+ export function isLineNumbersVisible(node) {
4
+ return node.attrs[CodeBlockNodeAttr.ShowLineNumbers] === 'true';
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iBAAiB,EAAC,mCAA0B;AAEpD,gBAAgB;AAChB,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;AACpE,CAAC","sourcesContent":["import type {Node} from '#pm/model';\n\nimport {CodeBlockNodeAttr} from '../CodeBlockSpecs';\n\n/** @internal */\nexport function isLineNumbersVisible(node: Node): boolean {\n return node.attrs[CodeBlockNodeAttr.ShowLineNumbers] === 'true';\n}\n"]}
@@ -22,6 +22,7 @@ export type LineNumbersOptions = {
22
22
  };
23
23
  export type CodeBlockSpecsOptions = {
24
24
  nodeview?: ExtensionNodeSpec['view'];
25
+ /** Configure line numbers in code block */
25
26
  lineNumbers?: LineNumbersOptions;
26
27
  };
27
28
  export declare const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n /** Configure line numbers in code block */\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import dd from 'ts-dedent';
2
2
  import { getLoggerFromState } from "../../../core/index.js";
3
- import { DataTransferType, isVSCode, tryParseVSCodeData } from "../../../utils/clipboard.js";
3
+ import { DataTransferType, isJetBrains, isVSCode, tryParseVSCodeData } from "../../../utils/clipboard.js";
4
4
  import { codeBlockType } from "./const.js";
5
5
  export const handlePaste = (view, e) => {
6
6
  const data = e.clipboardData;
@@ -67,9 +67,8 @@ export function getCodeData(data) {
67
67
  if (isVSCode(data)) {
68
68
  return processVSCodePaste(data, text);
69
69
  }
70
- const html = data.getData('text/html') || '';
71
- if (html && (html.includes('<pre') || html.includes('<code'))) {
72
- return processHtmlPaste(data, text);
70
+ if (isJetBrains(data)) {
71
+ return processJetBrainsPaste(text);
73
72
  }
74
73
  return null;
75
74
  }
@@ -82,19 +81,14 @@ function processVSCodePaste(data, text) {
82
81
  mode: vsCodeData?.mode,
83
82
  };
84
83
  }
85
- function processHtmlPaste(data, text) {
86
- const html = data.getData('text/html') || '';
87
- const inline = isInlineCodeFromHtml(html, text);
84
+ function processJetBrainsPaste(text) {
88
85
  return {
89
- editor: 'code-editor',
90
- value: inline ? text : dd(text),
91
- inline,
86
+ editor: 'jetbrains',
87
+ value: dd(text),
88
+ inline: isInlineCode(text),
92
89
  };
93
90
  }
94
91
  export function isInlineCode(text) {
95
92
  return !text.includes('\n');
96
93
  }
97
- function isInlineCodeFromHtml(html, text) {
98
- return html.includes('<code') && !html.includes('<pre') && isInlineCode(text);
99
- }
100
94
  //# sourceMappingURL=handle-paste.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle-paste.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/handle-paste.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport type {EditorProps} from '#pm/view';\nimport {DataTransferType, isVSCode, tryParseVSCodeData} from 'src/utils/clipboard';\n\nimport {codeBlockType} from './const';\n\nexport type CodePasteData = {\n editor: string;\n value: string;\n inline: boolean;\n mode?: string;\n};\n\ntype InsertCodeParams = {\n tr: Transaction;\n schema: Schema;\n code: CodePasteData;\n from: number;\n to: number;\n inCodeBlock: boolean;\n};\n\nexport const handlePaste: NonNullable<EditorProps['handlePaste']> = (view, e) => {\n const data = e.clipboardData;\n if (!data) return false;\n\n const code = getCodeData(data);\n if (!code) return false;\n\n const {state} = view;\n const {tr, schema, selection} = state;\n const $from = selection.$from;\n const inCodeBlock = Boolean($from.parent.type.spec.code);\n\n getLoggerFromState(state).event({\n domEvent: 'paste',\n event: 'paste-from-code-editor',\n editor: code.editor,\n editorMode: code.mode,\n empty: !code.value,\n inline: code.inline,\n dataTypes: Array.from(data.types),\n });\n\n if (!code.value) {\n return false;\n }\n\n insertCode({\n tr,\n schema,\n code,\n from: selection.from,\n to: selection.to,\n inCodeBlock,\n });\n\n view.dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n};\n\nexport function insertCode({tr, schema, code, from, to, inCodeBlock}: InsertCodeParams): void {\n if (inCodeBlock) {\n tr.insertText(code.value, from, to);\n } else if (code.inline) {\n insertInlineCode(tr, schema, code.value);\n } else {\n insertCodeBlock(tr, schema, code.value);\n }\n}\n\nfunction insertInlineCode(tr: Transaction, schema: Schema, value: string): void {\n const codeMarkType = schema.marks.code;\n const marks = codeMarkType ? [codeMarkType.create()] : undefined;\n const textNode = schema.text(value, marks);\n tr.replaceSelectionWith(textNode, false);\n}\n\nfunction insertCodeBlock(tr: Transaction, schema: Schema, value: string): void {\n const nodeType = codeBlockType(schema);\n const textNode = schema.text(value);\n const codeBlockNode = nodeType.create(null, textNode);\n tr.replaceSelectionWith(codeBlockNode);\n}\n\nexport function getCodeData(data: DataTransfer): CodePasteData | null {\n const text = data.getData(DataTransferType.Text);\n if (!text) return null;\n\n if (isVSCode(data)) {\n return processVSCodePaste(data, text);\n }\n\n const html = data.getData('text/html') || '';\n if (html && (html.includes('<pre') || html.includes('<code'))) {\n return processHtmlPaste(data, text);\n }\n\n return null;\n}\n\nfunction processVSCodePaste(data: DataTransfer, text: string): CodePasteData {\n const vsCodeData = tryParseVSCodeData(data);\n return {\n editor: 'vscode',\n value: dd(text),\n inline: isInlineCode(text),\n mode: vsCodeData?.mode,\n };\n}\n\nfunction processHtmlPaste(data: DataTransfer, text: string): CodePasteData {\n const html = data.getData('text/html') || '';\n const inline = isInlineCodeFromHtml(html, text);\n return {\n editor: 'code-editor',\n value: inline ? text : dd(text),\n inline,\n };\n}\n\nexport function isInlineCode(text: string): boolean {\n return !text.includes('\\n');\n}\n\nfunction isInlineCodeFromHtml(html: string, text: string): boolean {\n return html.includes('<code') && !html.includes('<pre') && isInlineCode(text);\n}\n"]}
1
+ {"version":3,"file":"handle-paste.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/handle-paste.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport type {EditorProps} from '#pm/view';\nimport {DataTransferType, isJetBrains, isVSCode, tryParseVSCodeData} from 'src/utils/clipboard';\n\nimport {codeBlockType} from './const';\n\nexport type CodePasteData = {\n editor: string;\n value: string;\n inline: boolean;\n mode?: string;\n};\n\ntype InsertCodeParams = {\n tr: Transaction;\n schema: Schema;\n code: CodePasteData;\n from: number;\n to: number;\n inCodeBlock: boolean;\n};\n\nexport const handlePaste: NonNullable<EditorProps['handlePaste']> = (view, e) => {\n const data = e.clipboardData;\n if (!data) return false;\n\n const code = getCodeData(data);\n if (!code) return false;\n\n const {state} = view;\n const {tr, schema, selection} = state;\n const $from = selection.$from;\n const inCodeBlock = Boolean($from.parent.type.spec.code);\n\n getLoggerFromState(state).event({\n domEvent: 'paste',\n event: 'paste-from-code-editor',\n editor: code.editor,\n editorMode: code.mode,\n empty: !code.value,\n inline: code.inline,\n dataTypes: Array.from(data.types),\n });\n\n if (!code.value) {\n return false;\n }\n\n insertCode({\n tr,\n schema,\n code,\n from: selection.from,\n to: selection.to,\n inCodeBlock,\n });\n\n view.dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n};\n\nexport function insertCode({tr, schema, code, from, to, inCodeBlock}: InsertCodeParams): void {\n if (inCodeBlock) {\n tr.insertText(code.value, from, to);\n } else if (code.inline) {\n insertInlineCode(tr, schema, code.value);\n } else {\n insertCodeBlock(tr, schema, code.value);\n }\n}\n\nfunction insertInlineCode(tr: Transaction, schema: Schema, value: string): void {\n const codeMarkType = schema.marks.code;\n const marks = codeMarkType ? [codeMarkType.create()] : undefined;\n const textNode = schema.text(value, marks);\n tr.replaceSelectionWith(textNode, false);\n}\n\nfunction insertCodeBlock(tr: Transaction, schema: Schema, value: string): void {\n const nodeType = codeBlockType(schema);\n const textNode = schema.text(value);\n const codeBlockNode = nodeType.create(null, textNode);\n tr.replaceSelectionWith(codeBlockNode);\n}\n\nexport function getCodeData(data: DataTransfer): CodePasteData | null {\n const text = data.getData(DataTransferType.Text);\n if (!text) return null;\n\n if (isVSCode(data)) {\n return processVSCodePaste(data, text);\n }\n\n if (isJetBrains(data)) {\n return processJetBrainsPaste(text);\n }\n\n return null;\n}\n\nfunction processVSCodePaste(data: DataTransfer, text: string): CodePasteData {\n const vsCodeData = tryParseVSCodeData(data);\n return {\n editor: 'vscode',\n value: dd(text),\n inline: isInlineCode(text),\n mode: vsCodeData?.mode,\n };\n}\n\nfunction processJetBrainsPaste(text: string): CodePasteData {\n return {\n editor: 'jetbrains',\n value: dd(text),\n inline: isInlineCode(text),\n };\n}\n\nexport function isInlineCode(text: string): boolean {\n return !text.includes('\\n');\n}\n"]}
@@ -7,6 +7,14 @@ export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlock
7
7
  export type CodeBlockOptions = CodeBlockSpecsOptions & {
8
8
  codeBlockKey?: string | null;
9
9
  langs?: HighlightLangMap;
10
+ /** Configure line wrapping toggle in code block */
11
+ lineWrapping?: {
12
+ /**
13
+ * Enable line wrapping toggling in code block
14
+ * @default false
15
+ */
16
+ enabled?: boolean;
17
+ };
10
18
  };
11
19
  export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
12
20
  declare global {
@@ -12,6 +12,9 @@ export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlock
12
12
  export const CodeBlock = (builder, opts) => {
13
13
  const optsNormalized = {
14
14
  ...opts,
15
+ lineWrapping: {
16
+ enabled: opts.lineWrapping?.enabled || false,
17
+ },
15
18
  lineNumbers: {
16
19
  enabled: typeof opts.lineNumbers?.enabled === 'boolean'
17
20
  ? opts.lineNumbers.enabled
@@ -47,6 +50,7 @@ export const CodeBlock = (builder, opts) => {
47
50
  builder.use(CodeBlockHighlight, {
48
51
  langs: optsNormalized.langs,
49
52
  lineNumbers: optsNormalized.lineNumbers,
53
+ lineWrapping: optsNormalized.lineWrapping,
50
54
  });
51
55
  }
52
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n /** Configure line wrapping toggle in code block */\n lineWrapping?: {\n /**\n * Enable line wrapping toggling in code block\n * @default false\n */\n enabled?: boolean;\n };\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineWrapping: {\n enabled: opts.lineWrapping?.enabled || false,\n },\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n lineWrapping: optsNormalized.lineWrapping,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  import { type Schema, Slice } from 'prosemirror-model';
2
2
  export declare function fixPastedTableBodies(slice: Slice, schema: Schema): Slice;
3
+ export declare function unpackSingleCellTable(slice: Slice): Slice;
@@ -1,6 +1,7 @@
1
1
  import { Fragment, Slice } from 'prosemirror-model';
2
+ import { TableRole } from "../../../table-utils/const.js";
2
3
  import { getChildrenOfNode } from "../../../utils/nodes.js";
3
- import { yfmTableBodyType, yfmTableType } from "./utils.js";
4
+ import { yfmTableBodyType, yfmTableCellType, yfmTableRowType, yfmTableType } from "./utils.js";
4
5
  export function fixPastedTableBodies(slice, schema) {
5
6
  if (slice.content.firstChild?.type === yfmTableBodyType(schema)) {
6
7
  const tRows = [];
@@ -16,4 +17,30 @@ export function fixPastedTableBodies(slice, schema) {
16
17
  }
17
18
  return slice;
18
19
  }
20
+ export function unpackSingleCellTable(slice) {
21
+ if (slice.content.childCount !== 1)
22
+ return slice;
23
+ if (!isSingeCellTable(slice.content.child(0)))
24
+ return slice;
25
+ let node = slice.content.child(0);
26
+ while (node && node.type.spec.tableRole !== TableRole.Cell) {
27
+ node = node.lastChild;
28
+ }
29
+ // get content from tableCell
30
+ const newFragment = Fragment.from(node?.content);
31
+ const newSlice = new Slice(newFragment, 0, 0);
32
+ return newSlice;
33
+ }
34
+ function isSingeCellTable(node) {
35
+ const { schema } = node.type;
36
+ if (node.type === yfmTableCellType(schema))
37
+ return true;
38
+ if (node.type === yfmTableRowType(schema) && node.childCount === 1)
39
+ return isSingeCellTable(node.child(0));
40
+ if (node.type === yfmTableBodyType(schema) && node.childCount === 1)
41
+ return isSingeCellTable(node.child(0));
42
+ if (node.type === yfmTableType(schema) && node.lastChild?.type === yfmTableBodyType(schema))
43
+ return isSingeCellTable(node.lastChild);
44
+ return false;
45
+ }
19
46
  //# sourceMappingURL=paste.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paste.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmTable/paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAA0B,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAC,iBAAiB,EAAC,gCAA6B;AAEvD,OAAO,EAAC,gBAAgB,EAAE,YAAY,EAAC,mBAAgB;AAEvD,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,MAAc;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,MAAM,CAAC;gBAAE,MAAM;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxC,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CACzC,IAAI,EACJ,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAC/C,CAAC;QACF,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\n\nimport {getChildrenOfNode} from '../../../utils/nodes';\n\nimport {yfmTableBodyType, yfmTableType} from './utils';\n\nexport function fixPastedTableBodies(slice: Slice, schema: Schema): Slice {\n if (slice.content.firstChild?.type === yfmTableBodyType(schema)) {\n const tRows: Node[] = [];\n let bodiesSize = 0;\n for (const {node, offset} of getChildrenOfNode(slice.content)) {\n if (node.type !== yfmTableBodyType(schema)) break;\n tRows.push(...getChildrenOfNode(node).map((item) => item.node));\n bodiesSize = offset + node.nodeSize;\n }\n const tableNode = yfmTableType(schema).create(\n null,\n yfmTableBodyType(schema).create(null, tRows),\n );\n slice = new Slice(Fragment.from(tableNode).append(slice.content.cut(bodiesSize)), 0, 0);\n }\n return slice;\n}\n"]}
1
+ {"version":3,"file":"paste.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmTable/paste.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\n\nimport {TableRole} from 'src/table-utils/const';\nimport {getChildrenOfNode} from 'src/utils/nodes';\n\nimport {yfmTableBodyType, yfmTableCellType, yfmTableRowType, yfmTableType} from './utils';\n\nexport function fixPastedTableBodies(slice: Slice, schema: Schema): Slice {\n if (slice.content.firstChild?.type === yfmTableBodyType(schema)) {\n const tRows: Node[] = [];\n let bodiesSize = 0;\n for (const {node, offset} of getChildrenOfNode(slice.content)) {\n if (node.type !== yfmTableBodyType(schema)) break;\n tRows.push(...getChildrenOfNode(node).map((item) => item.node));\n bodiesSize = offset + node.nodeSize;\n }\n const tableNode = yfmTableType(schema).create(\n null,\n yfmTableBodyType(schema).create(null, tRows),\n );\n slice = new Slice(Fragment.from(tableNode).append(slice.content.cut(bodiesSize)), 0, 0);\n }\n return slice;\n}\n\nexport function unpackSingleCellTable(slice: Slice): Slice {\n if (slice.content.childCount !== 1) return slice;\n if (!isSingeCellTable(slice.content.child(0))) return slice;\n\n let node: Node | null = slice.content.child(0);\n while (node && node.type.spec.tableRole !== TableRole.Cell) {\n node = node.lastChild;\n }\n\n // get content from tableCell\n const newFragment = Fragment.from(node?.content);\n const newSlice = new Slice(newFragment, 0, 0);\n\n return newSlice;\n}\n\nfunction isSingeCellTable(node: Node): boolean {\n const {schema} = node.type;\n\n if (node.type === yfmTableCellType(schema)) return true;\n\n if (node.type === yfmTableRowType(schema) && node.childCount === 1)\n return isSingeCellTable(node.child(0));\n\n if (node.type === yfmTableBodyType(schema) && node.childCount === 1)\n return isSingeCellTable(node.child(0));\n\n if (node.type === yfmTableType(schema) && node.lastChild?.type === yfmTableBodyType(schema))\n return isSingeCellTable(node.lastChild);\n\n return false;\n}\n"]}
@@ -1,9 +1,11 @@
1
1
  import { Plugin } from 'prosemirror-state';
2
- import { fixPastedTableBodies } from "../paste.js";
2
+ import { fixPastedTableBodies, unpackSingleCellTable } from "../paste.js";
3
3
  export const yfmTableTransformPastedPlugin = ({ schema }) => new Plugin({
4
4
  props: {
5
5
  transformPasted(slice) {
6
- return fixPastedTableBodies(slice, schema);
6
+ slice = unpackSingleCellTable(slice);
7
+ slice = fixPastedTableBodies(slice, schema);
8
+ return slice;
7
9
  },
8
10
  },
9
11
  });
@@ -1 +1 @@
1
- {"version":3,"file":"yfmTableTransformPastedPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAC,oBAAoB,EAAC,oBAAiB;AAK9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAAC,MAAM,EAAO,EAAE,EAAE,CAC5D,IAAI,MAAM,CAAC;IACP,KAAK,EAAE;QACH,eAAe,CAAC,KAAK;YACjB,OAAO,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KACJ;CACJ,CAAC,CAAC","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\n\nimport {fixPastedTableBodies} from '../paste';\n\ninterface Args {\n schema: Schema;\n}\nexport const yfmTableTransformPastedPlugin = ({schema}: Args) =>\n new Plugin({\n props: {\n transformPasted(slice) {\n return fixPastedTableBodies(slice, schema);\n },\n },\n });\n"]}
1
+ {"version":3,"file":"yfmTableTransformPastedPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAC,oBAAoB,EAAE,qBAAqB,EAAC,oBAAiB;AAKrE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAAC,MAAM,EAAO,EAAE,EAAE,CAC5D,IAAI,MAAM,CAAC;IACP,KAAK,EAAE;QACH,eAAe,CAAC,KAAK;YACjB,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACrC,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,KAAK,CAAC;QACjB,CAAC;KACJ;CACJ,CAAC,CAAC","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\n\nimport {fixPastedTableBodies, unpackSingleCellTable} from '../paste';\n\ninterface Args {\n schema: Schema;\n}\nexport const yfmTableTransformPastedPlugin = ({schema}: Args) =>\n new Plugin({\n props: {\n transformPasted(slice) {\n slice = unpackSingleCellTable(slice);\n slice = fixPastedTableBodies(slice, schema);\n return slice;\n },\n },\n });\n"]}
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "remove": "Remove",
3
3
  "empty_option": "No matches found",
4
+ "code_wrapping": "Text wrapping",
4
5
  "show_line_numbers": "Line numbers"
5
6
  }
@@ -1,7 +1,8 @@
1
- export declare const i18n: <G extends "remove" | "empty_option" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "remove" | "empty_option" | "code_wrapping" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  }) => S extends G ? {
4
4
  remove: string;
5
5
  empty_option: string;
6
+ code_wrapping: string;
6
7
  show_line_numbers: string;
7
8
  }[G] : string;
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "remove": "Удалить",
3
3
  "empty_option": "Ничего не найдено",
4
+ "code_wrapping": "Перенос текста",
4
5
  "show_line_numbers": "Нумерация строк"
5
6
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "code_wrapping": "Text wrapping"
3
+ }
@@ -0,0 +1,5 @@
1
+ export declare const i18n: <G extends "code_wrapping", S extends string>(key: G | (string extends S ? S : never), params?: {
2
+ [key: string]: any;
3
+ }) => S extends G ? {
4
+ code_wrapping: string;
5
+ }[G] : string;
@@ -0,0 +1,6 @@
1
+ import { registerKeyset } from "../i18n.js";
2
+ import en from "./en.json";
3
+ import ru from "./ru.json";
4
+ const KEYSET = 'widgets';
5
+ export const i18n = registerKeyset(KEYSET, { en, ru });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["i18n/viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,mBAAgB;AAEvC,OAAO,EAAE,kBAAkB;AAC3B,OAAO,EAAE,kBAAkB;AAE3B,MAAM,MAAM,GAAG,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,EAAC,EAAE,EAAE,EAAE,EAAC,CAAC,CAAC","sourcesContent":["import {registerKeyset} from '../i18n';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nconst KEYSET = 'widgets';\n\nexport const i18n = registerKeyset(KEYSET, {en, ru});\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "code_wrapping": "Перенос текста"
3
+ }
@@ -9,7 +9,7 @@ export type BaseTooltipNode = {
9
9
  node: Node;
10
10
  dom: HTMLElement | null;
11
11
  };
12
- export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void) => React.ReactElement | null;
12
+ export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void, rerender?: () => void) => React.ReactElement | null;
13
13
  export interface BaseTooltipPluginOptions {
14
14
  idPrefix: string;
15
15
  content?: TooltipContentCb;
@@ -160,7 +160,7 @@ export class BaseTooltipPluginView {
160
160
  return null;
161
161
  // hack for popup rerender
162
162
  window.dispatchEvent(new CustomEvent('scroll'));
163
- return (_jsx(Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: _jsx("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb) }) }));
163
+ return (_jsx(Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: _jsx("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb, undefined, undefined, () => this.render()) }) }));
164
164
  }
165
165
  createRenderItem() {
166
166
  return getReactRendererFromState(this.view.state).createItem(this.idPrefix, () => this.currentNode && !this.manualHidden ? (_jsx(ErrorLoggerBoundary, { children: this.renderContent(this.currentNode) })) : null);