@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,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toggleLineWrapping = exports.toggleLineNumbers = exports.isLineNumbersVisible = void 0;
4
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
5
+ const codeBlockLineWrappingPlugin_1 = require("../plugins/codeBlockLineWrappingPlugin.js");
6
+ const utils_1 = require("../utils.js");
7
+ /** @internal */
8
+ var utils_2 = require("../utils.js");
9
+ Object.defineProperty(exports, "isLineNumbersVisible", { enumerable: true, get: function () { return utils_2.isLineNumbersVisible; } });
10
+ /** @internal */
11
+ const toggleLineNumbers = ({ node, pos, state, dispatch }) => {
12
+ const showLineNumbers = (0, utils_1.isLineNumbersVisible)(node);
13
+ dispatch(state.tr.setNodeAttribute(pos, CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers, showLineNumbers ? '' : 'true'));
14
+ };
15
+ exports.toggleLineNumbers = toggleLineNumbers;
16
+ /** @internal */
17
+ const toggleLineWrapping = ({ pos, state, dispatch }) => {
18
+ const { tr } = state;
19
+ const hasLineWrapping = (0, codeBlockLineWrappingPlugin_1.isNodeHasLineWrapping)(state, pos);
20
+ if (hasLineWrapping)
21
+ (0, codeBlockLineWrappingPlugin_1.disableLineWrapping)(tr, pos);
22
+ else
23
+ (0, codeBlockLineWrappingPlugin_1.enableLineWrapping)(tr, pos);
24
+ dispatch(tr);
25
+ };
26
+ exports.toggleLineWrapping = toggleLineWrapping;
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.ts"],"names":[],"mappings":";;;AAGA,kEAAuD;AACvD,2FAIgD;AAChD,uCAA8C;AAE9C,gBAAgB;AAChB,qCAA8C;AAAtC,6GAAA,oBAAoB,OAAA;AAE5B,gBAAgB;AACT,MAAM,iBAAiB,GAKjB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC1C,MAAM,eAAe,GAAG,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CACJ,KAAK,CAAC,EAAE,CAAC,gBAAgB,CACrB,GAAG,EACH,kCAAiB,CAAC,eAAe,EACjC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAChC,CACJ,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEF,gBAAgB;AACT,MAAM,kBAAkB,GAKlB,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IACpC,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;IACnB,MAAM,eAAe,GAAG,IAAA,mDAAqB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,eAAe;QAAE,IAAA,iDAAmB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;QAC7C,IAAA,gDAAkB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B","sourcesContent":["import type {Node} from '#pm/model';\nimport type {EditorState, Transaction} from '#pm/state';\n\nimport {CodeBlockNodeAttr} from '../../CodeBlockSpecs';\nimport {\n disableLineWrapping,\n enableLineWrapping,\n isNodeHasLineWrapping,\n} from '../plugins/codeBlockLineWrappingPlugin';\nimport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport const toggleLineNumbers: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({node, pos, state, dispatch}) => {\n const showLineNumbers = isLineNumbersVisible(node);\n dispatch(\n state.tr.setNodeAttribute(\n pos,\n CodeBlockNodeAttr.ShowLineNumbers,\n showLineNumbers ? '' : 'true',\n ),\n );\n};\n\n/** @internal */\nexport const toggleLineWrapping: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({pos, state, dispatch}) => {\n const {tr} = state;\n const hasLineWrapping = isNodeHasLineWrapping(state, pos);\n if (hasLineWrapping) disableLineWrapping(tr, pos);\n else enableLineWrapping(tr, pos);\n dispatch(tr);\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const PlainTextLang = "plaintext";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlainTextLang = void 0;
4
+ exports.PlainTextLang = 'plaintext';
5
+ //# 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,QAAA,aAAa,GAAG,WAAW,CAAC","sourcesContent":["export const PlainTextLang = 'plaintext';\n"]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeBlockLineNumbersPlugin = void 0;
4
+ const state_1 = require("../../../../../pm/state.js");
5
+ const utils_1 = require("../../../../../pm/utils.js");
6
+ const view_1 = require("../../../../../pm/view.js");
7
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
8
+ const utils_2 = require("../utils.js");
9
+ const pluginKey = new state_1.PluginKey('code_block_line_numbers_decorations');
10
+ /** @internal */
11
+ const codeBlockLineNumbersPlugin = () => {
12
+ return new state_1.Plugin({
13
+ key: pluginKey,
14
+ state: {
15
+ init(_config, state) {
16
+ return getDecorations(state.doc);
17
+ },
18
+ apply(tr, decos) {
19
+ if (tr.docChanged) {
20
+ return getDecorations(tr.doc);
21
+ }
22
+ return decos.map(tr.mapping, tr.doc);
23
+ },
24
+ },
25
+ props: {
26
+ decorations(state) {
27
+ return pluginKey.getState(state);
28
+ },
29
+ },
30
+ });
31
+ };
32
+ exports.codeBlockLineNumbersPlugin = codeBlockLineNumbersPlugin;
33
+ function getDecorations(doc) {
34
+ const decos = [];
35
+ for (const { node, pos } of (0, utils_1.findChildrenByType)(doc, (0, CodeBlockSpecs_1.codeBlockType)(doc.type.schema), true)) {
36
+ if (!(0, utils_2.isLineNumbersVisible)(node))
37
+ continue;
38
+ const codeContent = node.textContent;
39
+ const contentByLines = codeContent.split('\n');
40
+ const maxDigits = String(contentByLines.length).length;
41
+ let shift = 0;
42
+ for (let i = 0; i < contentByLines.length; i++) {
43
+ const line = contentByLines[i];
44
+ {
45
+ const elem = document.createElement('span');
46
+ elem.classList.add('yfm-line-number');
47
+ elem.textContent = String(i + 1).padStart(maxDigits, ' ');
48
+ decos.push(view_1.Decoration.widget(pos + shift + 1, elem, { side: 1, ignoreSelection: true }));
49
+ }
50
+ shift += line.length + 1;
51
+ }
52
+ }
53
+ return view_1.DecorationSet.create(doc, decos);
54
+ }
55
+ //# 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,sDAA4C;AAC5C,sDAA6C;AAC7C,oDAAmD;AAEnD,kEAAmD;AACnD,uCAA8C;AAE9C,MAAM,SAAS,GAAG,IAAI,iBAAS,CAAgB,qCAAqC,CAAC,CAAC;AAEtF,gBAAgB;AACT,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC3C,OAAO,IAAI,cAAM,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;AArBW,QAAA,0BAA0B,8BAqBrC;AAEF,SAAS,cAAc,CAAC,GAAS;IAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,IAAI,IAAA,0BAAkB,EAAC,GAAG,EAAE,IAAA,8BAAa,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,IAAA,4BAAoB,EAAC,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,iBAAU,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,oBAAa,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,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeBlockLineWrappingPlugin = exports.isNodeHasLineWrapping = exports.hasLineWrappingDecoration = void 0;
4
+ exports.enableLineWrapping = enableLineWrapping;
5
+ exports.disableLineWrapping = disableLineWrapping;
6
+ const state_1 = require("../../../../../pm/state.js");
7
+ const view_1 = require("../../../../../pm/view.js");
8
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
9
+ const pluginKey = new state_1.PluginKey('code_block_line_wrapping');
10
+ const WRAPPING_SPEC_KEY = '__code_block_line_wrapping';
11
+ const WRAPPING_SPEC_VALUE = true;
12
+ const isLineWrappingDecoration = (deco) => deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;
13
+ /** @internal */
14
+ const hasLineWrappingDecoration = (decorations) => {
15
+ return decorations.some(isLineWrappingDecoration);
16
+ };
17
+ exports.hasLineWrappingDecoration = hasLineWrappingDecoration;
18
+ /** @internal */
19
+ const isNodeHasLineWrapping = (state, pos) => {
20
+ const node = state.doc.nodeAt(pos);
21
+ if (!node || node.type !== (0, CodeBlockSpecs_1.codeBlockType)(state.doc.type.schema))
22
+ return false;
23
+ const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);
24
+ return decos?.some(isLineWrappingDecoration) ?? false;
25
+ };
26
+ exports.isNodeHasLineWrapping = isNodeHasLineWrapping;
27
+ /** @internal */
28
+ function enableLineWrapping(tr, pos) {
29
+ return tr.setMeta(pluginKey, { type: 'add', pos });
30
+ }
31
+ /** @internal */
32
+ function disableLineWrapping(tr, pos) {
33
+ return tr.setMeta(pluginKey, { type: 'remove', pos });
34
+ }
35
+ /** @internal */
36
+ const codeBlockLineWrappingPlugin = () => {
37
+ return new state_1.Plugin({
38
+ key: pluginKey,
39
+ state: {
40
+ init() {
41
+ return {
42
+ decorations: view_1.DecorationSet.empty,
43
+ };
44
+ },
45
+ apply(tr, value) {
46
+ let decorations = value.decorations.map(tr.mapping, tr.doc);
47
+ if (tr.getMeta(pluginKey)) {
48
+ const meta = tr.getMeta(pluginKey);
49
+ if (meta.type === 'add') {
50
+ const node = tr.doc.nodeAt(meta.pos);
51
+ if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
52
+ const from = meta.pos;
53
+ const to = meta.pos + node.nodeSize;
54
+ decorations = decorations.add(tr.doc, [
55
+ view_1.Decoration.node(from, to, {}, { [WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE }),
56
+ ]);
57
+ }
58
+ }
59
+ else if (meta.type === 'remove') {
60
+ const node = tr.doc.nodeAt(meta.pos);
61
+ if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
62
+ const start = meta.pos + 1;
63
+ const end = meta.pos + node.nodeSize - 1;
64
+ const found = decorations.find(start, end);
65
+ decorations = decorations.remove(found);
66
+ }
67
+ }
68
+ }
69
+ return { decorations };
70
+ },
71
+ },
72
+ props: {
73
+ decorations(state) {
74
+ return pluginKey.getState(state)?.decorations;
75
+ },
76
+ },
77
+ });
78
+ };
79
+ exports.codeBlockLineWrappingPlugin = codeBlockLineWrappingPlugin;
80
+ //# 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,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isLineNumbersVisible = isLineNumbersVisible;
4
+ const CodeBlockSpecs_1 = require("../CodeBlockSpecs/index.js");
5
+ /** @internal */
6
+ function isLineNumbersVisible(node) {
7
+ return node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers] === 'true';
8
+ }
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/utils.ts"],"names":[],"mappings":";;AAKA,oDAEC;AALD,+DAAoD;AAEpD,gBAAgB;AAChB,SAAgB,oBAAoB,CAAC,IAAU;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,kCAAiB,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"]}
@@ -75,9 +75,8 @@ function getCodeData(data) {
75
75
  if ((0, clipboard_1.isVSCode)(data)) {
76
76
  return processVSCodePaste(data, text);
77
77
  }
78
- const html = data.getData('text/html') || '';
79
- if (html && (html.includes('<pre') || html.includes('<code'))) {
80
- return processHtmlPaste(data, text);
78
+ if ((0, clipboard_1.isJetBrains)(data)) {
79
+ return processJetBrainsPaste(text);
81
80
  }
82
81
  return null;
83
82
  }
@@ -90,19 +89,14 @@ function processVSCodePaste(data, text) {
90
89
  mode: vsCodeData?.mode,
91
90
  };
92
91
  }
93
- function processHtmlPaste(data, text) {
94
- const html = data.getData('text/html') || '';
95
- const inline = isInlineCodeFromHtml(html, text);
92
+ function processJetBrainsPaste(text) {
96
93
  return {
97
- editor: 'code-editor',
98
- value: inline ? text : (0, ts_dedent_1.default)(text),
99
- inline,
94
+ editor: 'jetbrains',
95
+ value: (0, ts_dedent_1.default)(text),
96
+ inline: isInlineCode(text),
100
97
  };
101
98
  }
102
99
  function isInlineCode(text) {
103
100
  return !text.includes('\n');
104
101
  }
105
- function isInlineCodeFromHtml(html, text) {
106
- return html.includes('<code') && !html.includes('<pre') && isInlineCode(text);
107
- }
108
102
  //# 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 {
@@ -19,6 +19,9 @@ Object.defineProperty(exports, "codeBlockType", { enumerable: true, get: functio
19
19
  const CodeBlock = (builder, opts) => {
20
20
  const optsNormalized = {
21
21
  ...opts,
22
+ lineWrapping: {
23
+ enabled: opts.lineWrapping?.enabled || false,
24
+ },
22
25
  lineNumbers: {
23
26
  enabled: typeof opts.lineNumbers?.enabled === 'boolean'
24
27
  ? opts.lineNumbers.enabled
@@ -54,6 +57,7 @@ const CodeBlock = (builder, opts) => {
54
57
  builder.use(CodeBlockHighlight_1.CodeBlockHighlight, {
55
58
  langs: optsNormalized.langs,
56
59
  lineNumbers: optsNormalized.lineNumbers,
60
+ lineWrapping: optsNormalized.lineWrapping,
57
61
  });
58
62
  }
59
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":";;;AAEA,gDAA8C;AAC9C,+CAAsC;AACtC,6DAA4D;AAC5D,qDAA+C;AAE/C,mFAAkG;AAClG,8DAA4E;AAC5E,4CAA2E;AAC3E,sCAA2E;AAC3E,4EAAoE;AAEpE,0CAA0C;AAAlC,0GAAA,cAAc,OAAA;AACtB,4DAAqF;AAA7E,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAAE,+GAAA,aAAa,OAAA;AAOpD,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,MAAM,cAAc,GAAqB;QACrC,GAAG,IAAI;QACP,WAAW,EAAE;YACT,OAAO,EACH,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,SAAS;gBAC1C,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO;gBAC1B,CAAC,CAAC,iCAAyB,CAAC,OAAO;YAC3C,aAAa,EACT,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,KAAK,SAAS;gBAChD,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa;gBAChC,CAAC,CAAC,iCAAyB,CAAC,aAAa;SACpD;KACJ,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAAc,EAAE,cAAc,CAAC,CAAC;IAE5C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,EAAC,YAAY,EAAC,GAAG,cAAc,CAAC;QACtC,MAAM,QAAQ,GAAW,EAAC,KAAK,EAAE,wBAAa,EAAE,SAAS,EAAE,yBAAc,EAAC,CAAC;QAC3E,IAAI,YAAY,EAAE,CAAC;YACf,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAA,sBAAa,EAAC,YAAY,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,aAAa,CAAC,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,SAAS,CAAC,gBAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,IAAA,qBAAa,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO;YACH,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAmB,EAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7D,QAAQ,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC;YAChC,GAAG,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC;SAC9B,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,CAAC,2CAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/D,IAAI,IAAA,mBAAU,EAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,uCAAkB,EAAE;YAC5B,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,WAAW,EAAE,cAAc,CAAC,WAAW;SAC1C,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC;AA9CW,QAAA,SAAS,aA8CpB;AAUF,mEAAmE;AACnE,6DAA6D;AAC7D,SAAS,aAAa,CAAC,QAAkB;IACrC,OAAO,IAAA,mCAAsB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC","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,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fixPastedTableBodies = fixPastedTableBodies;
4
+ exports.unpackSingleCellTable = unpackSingleCellTable;
4
5
  const prosemirror_model_1 = require("prosemirror-model");
6
+ const const_1 = require("../../../table-utils/const.js");
5
7
  const nodes_1 = require("../../../utils/nodes.js");
6
8
  const utils_1 = require("./utils.js");
7
9
  function fixPastedTableBodies(slice, schema) {
@@ -19,4 +21,30 @@ function fixPastedTableBodies(slice, schema) {
19
21
  }
20
22
  return slice;
21
23
  }
24
+ function unpackSingleCellTable(slice) {
25
+ if (slice.content.childCount !== 1)
26
+ return slice;
27
+ if (!isSingeCellTable(slice.content.child(0)))
28
+ return slice;
29
+ let node = slice.content.child(0);
30
+ while (node && node.type.spec.tableRole !== const_1.TableRole.Cell) {
31
+ node = node.lastChild;
32
+ }
33
+ // get content from tableCell
34
+ const newFragment = prosemirror_model_1.Fragment.from(node?.content);
35
+ const newSlice = new prosemirror_model_1.Slice(newFragment, 0, 0);
36
+ return newSlice;
37
+ }
38
+ function isSingeCellTable(node) {
39
+ const { schema } = node.type;
40
+ if (node.type === (0, utils_1.yfmTableCellType)(schema))
41
+ return true;
42
+ if (node.type === (0, utils_1.yfmTableRowType)(schema) && node.childCount === 1)
43
+ return isSingeCellTable(node.child(0));
44
+ if (node.type === (0, utils_1.yfmTableBodyType)(schema) && node.childCount === 1)
45
+ return isSingeCellTable(node.child(0));
46
+ if (node.type === (0, utils_1.yfmTableType)(schema) && node.lastChild?.type === (0, utils_1.yfmTableBodyType)(schema))
47
+ return isSingeCellTable(node.lastChild);
48
+ return false;
49
+ }
22
50
  //# sourceMappingURL=paste.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paste.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmTable/paste.ts"],"names":[],"mappings":";;AAMA,oDAgBC;AAtBD,yDAA0E;AAE1E,mDAAuD;AAEvD,sCAAuD;AAEvD,SAAgB,oBAAoB,CAAC,KAAY,EAAE,MAAc;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,IAAA,wBAAgB,EAAC,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,IAAA,yBAAiB,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,IAAA,wBAAgB,EAAC,MAAM,CAAC;gBAAE,MAAM;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,yBAAiB,EAAC,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,IAAA,oBAAY,EAAC,MAAM,CAAC,CAAC,MAAM,CACzC,IAAI,EACJ,IAAA,wBAAgB,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAC/C,CAAC;QACF,KAAK,GAAG,IAAI,yBAAK,CAAC,4BAAQ,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"]}
@@ -6,7 +6,9 @@ const paste_1 = require("../paste.js");
6
6
  const yfmTableTransformPastedPlugin = ({ schema }) => new prosemirror_state_1.Plugin({
7
7
  props: {
8
8
  transformPasted(slice) {
9
- return (0, paste_1.fixPastedTableBodies)(slice, schema);
9
+ slice = (0, paste_1.unpackSingleCellTable)(slice);
10
+ slice = (0, paste_1.fixPastedTableBodies)(slice, schema);
11
+ return slice;
10
12
  },
11
13
  },
12
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"yfmTableTransformPastedPlugin.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.ts"],"names":[],"mappings":";;;AACA,yDAAyC;AAEzC,uCAA8C;AAKvC,MAAM,6BAA6B,GAAG,CAAC,EAAC,MAAM,EAAO,EAAE,EAAE,CAC5D,IAAI,0BAAM,CAAC;IACP,KAAK,EAAE;QACH,eAAe,CAAC,KAAK;YACjB,OAAO,IAAA,4BAAoB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KACJ;CACJ,CAAC,CAAC;AAPM,QAAA,6BAA6B,iCAOnC","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,yDAAyC;AAEzC,uCAAqE;AAK9D,MAAM,6BAA6B,GAAG,CAAC,EAAC,MAAM,EAAO,EAAE,EAAE,CAC5D,IAAI,0BAAM,CAAC;IACP,KAAK,EAAE;QACH,eAAe,CAAC,KAAK;YACjB,KAAK,GAAG,IAAA,6BAAqB,EAAC,KAAK,CAAC,CAAC;YACrC,KAAK,GAAG,IAAA,4BAAoB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,KAAK,CAAC;QACjB,CAAC;KACJ;CACJ,CAAC,CAAC;AATM,QAAA,6BAA6B,iCASnC","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,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.i18n = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const i18n_1 = require("../i18n.js");
6
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
7
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
8
+ const KEYSET = 'widgets';
9
+ exports.i18n = (0, i18n_1.registerKeyset)(KEYSET, { en: en_json_1.default, ru: ru_json_1.default });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["i18n/viewer/index.ts"],"names":[],"mappings":";;;;AAAA,qCAAuC;AAEvC,gEAA2B;AAC3B,gEAA2B;AAE3B,MAAM,MAAM,GAAG,SAAS,CAAC;AAEZ,QAAA,IAAI,GAAG,IAAA,qBAAc,EAAC,MAAM,EAAE,EAAC,EAAE,EAAF,iBAAE,EAAE,EAAE,EAAF,iBAAE,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;