@gravity-ui/markdown-editor 15.30.0 → 15.32.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 (41) hide show
  1. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +9 -0
  2. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  3. package/build/cjs/extensions/markdown/CodeBlock/const.d.ts +2 -1
  4. package/build/cjs/extensions/markdown/CodeBlock/const.js +6 -1
  5. package/build/cjs/extensions/markdown/CodeBlock/const.js.map +1 -1
  6. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js +6 -12
  7. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
  8. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +1 -2
  9. package/build/cjs/extensions/markdown/CodeBlock/index.js +5 -7
  10. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  11. package/build/cjs/extensions/yfm/YfmTable/paste.d.ts +1 -0
  12. package/build/cjs/extensions/yfm/YfmTable/paste.js +28 -0
  13. package/build/cjs/extensions/yfm/YfmTable/paste.js.map +1 -1
  14. package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +3 -1
  15. package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
  16. package/build/cjs/utils/clipboard.d.ts +1 -0
  17. package/build/cjs/utils/clipboard.js +7 -0
  18. package/build/cjs/utils/clipboard.js.map +1 -1
  19. package/build/cjs/version.js +1 -1
  20. package/build/cjs/version.js.map +1 -1
  21. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +9 -0
  22. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  23. package/build/esm/extensions/markdown/CodeBlock/const.d.ts +2 -1
  24. package/build/esm/extensions/markdown/CodeBlock/const.js +5 -0
  25. package/build/esm/extensions/markdown/CodeBlock/const.js.map +1 -1
  26. package/build/esm/extensions/markdown/CodeBlock/handle-paste.js +7 -13
  27. package/build/esm/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
  28. package/build/esm/extensions/markdown/CodeBlock/index.d.ts +1 -2
  29. package/build/esm/extensions/markdown/CodeBlock/index.js +3 -5
  30. package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
  31. package/build/esm/extensions/yfm/YfmTable/paste.d.ts +1 -0
  32. package/build/esm/extensions/yfm/YfmTable/paste.js +28 -1
  33. package/build/esm/extensions/yfm/YfmTable/paste.js.map +1 -1
  34. package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +4 -2
  35. package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
  36. package/build/esm/utils/clipboard.d.ts +1 -0
  37. package/build/esm/utils/clipboard.js +6 -0
  38. package/build/esm/utils/clipboard.js.map +1 -1
  39. package/build/esm/version.js +1 -1
  40. package/build/esm/version.js.map +1 -1
  41. package/package.json +1 -1
@@ -8,7 +8,16 @@ export declare const CodeBlockNodeAttr: {
8
8
  export declare const codeBlockNodeName = "code_block";
9
9
  export declare const codeBlockType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
10
10
  export type LineNumbersOptions = {
11
+ /**
12
+ * Allow line numbers in codeblock.
13
+ * Available with @diplodoc/transform v4.55.0 or higher.
14
+ * @default true
15
+ */
11
16
  enabled?: boolean;
17
+ /**
18
+ * By default, new code blocks are added with line numbers.
19
+ * @default false
20
+ */
12
21
  showByDefault?: boolean;
13
22
  };
14
23
  export type 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 '../../../../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 = {enabled?: boolean; showByDefault?: boolean};\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 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,4 +1,5 @@
1
- import { codeBlockType } from "./CodeBlockSpecs/index.js";
1
+ import { type LineNumbersOptions, codeBlockType } from "./CodeBlockSpecs/index.js";
2
2
  export { codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr } from "./CodeBlockSpecs/index.js";
3
3
  export declare const cbAction = "toCodeBlock";
4
4
  export { codeBlockType };
5
+ export declare const lineNumbersOptionsDefault: LineNumbersOptions;
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.codeBlockType = exports.cbAction = exports.CodeBlockAttr = exports.codeBlockNodeName = void 0;
3
+ exports.lineNumbersOptionsDefault = exports.codeBlockType = exports.cbAction = exports.CodeBlockAttr = exports.codeBlockNodeName = void 0;
4
4
  const CodeBlockSpecs_1 = require("./CodeBlockSpecs/index.js");
5
5
  Object.defineProperty(exports, "codeBlockType", { enumerable: true, get: function () { return CodeBlockSpecs_1.codeBlockType; } });
6
6
  var CodeBlockSpecs_2 = require("./CodeBlockSpecs/index.js");
7
7
  Object.defineProperty(exports, "codeBlockNodeName", { enumerable: true, get: function () { return CodeBlockSpecs_2.codeBlockNodeName; } });
8
8
  Object.defineProperty(exports, "CodeBlockAttr", { enumerable: true, get: function () { return CodeBlockSpecs_2.CodeBlockNodeAttr; } });
9
9
  exports.cbAction = 'toCodeBlock';
10
+ // After changing the default, don't forget to update LineNumbersOptions
11
+ exports.lineNumbersOptionsDefault = {
12
+ enabled: true,
13
+ showByDefault: false,
14
+ };
10
15
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":";;;AAAA,8DAA+C;AAIvC,8FAJA,8BAAa,OAIA;AAFrB,4DAAuF;AAA/E,mHAAA,iBAAiB,OAAA;AAAE,+GAAA,iBAAiB,OAAiB;AAChD,QAAA,QAAQ,GAAG,aAAa,CAAC","sourcesContent":["import {codeBlockType} from './CodeBlockSpecs';\n\nexport {codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr} from './CodeBlockSpecs';\nexport const cbAction = 'toCodeBlock';\nexport {codeBlockType};\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":";;;AAAA,8DAAwE;AAIhE,8FAJyB,8BAAa,OAIzB;AAFrB,4DAAuF;AAA/E,mHAAA,iBAAiB,OAAA;AAAE,+GAAA,iBAAiB,OAAiB;AAChD,QAAA,QAAQ,GAAG,aAAa,CAAC;AAGtC,wEAAwE;AAC3D,QAAA,yBAAyB,GAAuB;IACzD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,KAAK;CACvB,CAAC","sourcesContent":["import {type LineNumbersOptions, codeBlockType} from './CodeBlockSpecs';\n\nexport {codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr} from './CodeBlockSpecs';\nexport const cbAction = 'toCodeBlock';\nexport {codeBlockType};\n\n// After changing the default, don't forget to update LineNumbersOptions\nexport const lineNumbersOptionsDefault: LineNumbersOptions = {\n enabled: true,\n showByDefault: false,\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"]}
@@ -1,6 +1,6 @@
1
1
  import type { Action, ExtensionAuto } from "../../../core/index.js";
2
2
  import { type HighlightLangMap } from "./CodeBlockHighlight/CodeBlockHighlight.js";
3
- import { type CodeBlockSpecsOptions, type LineNumbersOptions } from "./CodeBlockSpecs/index.js";
3
+ import { type CodeBlockSpecsOptions } from "./CodeBlockSpecs/index.js";
4
4
  import { cbAction } from "./const.js";
5
5
  export { resetCodeblock } from "./commands.js";
6
6
  export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlockSpecs/index.js";
@@ -8,7 +8,6 @@ export type CodeBlockOptions = CodeBlockSpecsOptions & {
8
8
  codeBlockKey?: string | null;
9
9
  langs?: HighlightLangMap;
10
10
  };
11
- export declare const lineNumbersOptionsDefault: LineNumbersOptions;
12
11
  export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
13
12
  declare global {
14
13
  namespace WysiwygEditor {
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeBlock = exports.lineNumbersOptionsDefault = exports.codeBlockType = exports.CodeBlockNodeAttr = exports.codeBlockNodeName = exports.resetCodeblock = void 0;
4
- // @ts-ignore // TODO: fix cjs build
5
- const prosemirror_utils_1 = require("prosemirror-utils");
3
+ exports.CodeBlock = exports.codeBlockType = exports.CodeBlockNodeAttr = exports.codeBlockNodeName = exports.resetCodeblock = void 0;
4
+ const utils_1 = require("../../../pm/utils.js");
6
5
  const lodash_1 = require("../../../lodash.js");
7
6
  const inputrules_1 = require("../../../utils/inputrules.js");
8
7
  const keymap_1 = require("../../../utils/keymap.js");
@@ -17,17 +16,16 @@ var CodeBlockSpecs_2 = require("./CodeBlockSpecs/index.js");
17
16
  Object.defineProperty(exports, "codeBlockNodeName", { enumerable: true, get: function () { return CodeBlockSpecs_2.codeBlockNodeName; } });
18
17
  Object.defineProperty(exports, "CodeBlockNodeAttr", { enumerable: true, get: function () { return CodeBlockSpecs_2.CodeBlockNodeAttr; } });
19
18
  Object.defineProperty(exports, "codeBlockType", { enumerable: true, get: function () { return CodeBlockSpecs_2.codeBlockType; } });
20
- exports.lineNumbersOptionsDefault = { enabled: true, showByDefault: true };
21
19
  const CodeBlock = (builder, opts) => {
22
20
  const optsNormalized = {
23
21
  ...opts,
24
22
  lineNumbers: {
25
23
  enabled: typeof opts.lineNumbers?.enabled === 'boolean'
26
24
  ? opts.lineNumbers.enabled
27
- : exports.lineNumbersOptionsDefault.enabled,
25
+ : const_1.lineNumbersOptionsDefault.enabled,
28
26
  showByDefault: typeof opts.lineNumbers?.showByDefault === 'boolean'
29
27
  ? opts.lineNumbers.showByDefault
30
- : exports.lineNumbersOptionsDefault.showByDefault,
28
+ : const_1.lineNumbersOptionsDefault.showByDefault,
31
29
  },
32
30
  };
33
31
  builder.use(CodeBlockSpecs_1.CodeBlockSpecs, optsNormalized);
@@ -43,7 +41,7 @@ const CodeBlock = (builder, opts) => {
43
41
  builder.addAction(const_1.cbAction, (deps) => {
44
42
  const cb = (0, const_1.codeBlockType)(deps.schema);
45
43
  return {
46
- isActive: (state) => (0, prosemirror_utils_1.hasParentNodeOfType)(cb)(state.selection),
44
+ isActive: (state) => (0, utils_1.hasParentNodeOfType)(cb)(state.selection),
47
45
  isEnable: (0, commands_1.setCodeBlockType)(deps),
48
46
  run: (0, commands_1.setCodeBlockType)(deps),
49
47
  };
@@ -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 {NodeType} from 'prosemirror-model';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNodeOfType} from 'prosemirror-utils';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {textblockTypeInputRule} from '../../../utils/inputrules';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {\n CodeBlockSpecs,\n type CodeBlockSpecsOptions,\n type LineNumbersOptions,\n} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType} 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 lineNumbersOptionsDefault: LineNumbersOptions = {enabled: true, showByDefault: true};\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":";;;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,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"]}
@@ -12,6 +12,7 @@ export declare function isFilesOnly({ types }: DataTransfer): boolean;
12
12
  export declare function isFilesFromHtml({ types }: DataTransfer): boolean;
13
13
  export declare function isImageFile(file: File): boolean;
14
14
  export declare function isVSCode(data: DataTransfer): boolean;
15
+ export declare function isJetBrains(data: DataTransfer): boolean;
15
16
  export type VSCodeData = {
16
17
  version: number;
17
18
  isFromEmptySelection: boolean;
@@ -5,6 +5,7 @@ exports.isFilesOnly = isFilesOnly;
5
5
  exports.isFilesFromHtml = isFilesFromHtml;
6
6
  exports.isImageFile = isImageFile;
7
7
  exports.isVSCode = isVSCode;
8
+ exports.isJetBrains = isJetBrains;
8
9
  exports.tryParseVSCodeData = tryParseVSCodeData;
9
10
  exports.shouldSkipHtmlConversion = shouldSkipHtmlConversion;
10
11
  /** Сontains all data formats known to us */
@@ -32,6 +33,12 @@ function isImageFile(file) {
32
33
  function isVSCode(data) {
33
34
  return data.types.includes(DataTransferType.VSCodeData);
34
35
  }
36
+ function isJetBrains(data) {
37
+ if (!data.types.includes(DataTransferType.Rtf))
38
+ return false;
39
+ const rtf = data.getData(DataTransferType.Rtf);
40
+ return rtf.indexOf('\\fmodern JetBrains') > 0;
41
+ }
35
42
  function tryParseVSCodeData(data) {
36
43
  try {
37
44
  return JSON.parse(data.getData(DataTransferType.VSCodeData));
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAUD,gDAOC;AAKD,4DAoBC;AAvED,4CAA4C;AAC5C,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,gCAAhB,gBAAgB,QAQ3B;AAED,SAAgB,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,SAAgB,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAUD,SAAgB,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAED,kCAIC;AAUD,gDAOC;AAKD,4DAoBC;AA7ED,4CAA4C;AAC5C,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,gCAAhB,gBAAgB,QAQ3B;AAED,SAAgB,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,SAAgB,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,WAAW,CAAC,IAAkB;IAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAUD,SAAgB,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport function isJetBrains(data: DataTransfer): boolean {\n if (!data.types.includes(DataTransferType.Rtf)) return false;\n const rtf = data.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\\\fmodern JetBrains') > 0;\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.30.0' !== 'undefined' ? '15.30.0' : 'unknown';
5
+ exports.VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.30.0' !== 'undefined' ? '15.30.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';\n"]}
@@ -8,7 +8,16 @@ export declare const CodeBlockNodeAttr: {
8
8
  export declare const codeBlockNodeName = "code_block";
9
9
  export declare const codeBlockType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
10
10
  export type LineNumbersOptions = {
11
+ /**
12
+ * Allow line numbers in codeblock.
13
+ * Available with @diplodoc/transform v4.55.0 or higher.
14
+ * @default true
15
+ */
11
16
  enabled?: boolean;
17
+ /**
18
+ * By default, new code blocks are added with line numbers.
19
+ * @default false
20
+ */
12
21
  showByDefault?: boolean;
13
22
  };
14
23
  export type 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 '../../../../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 = {enabled?: boolean; showByDefault?: boolean};\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 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,4 +1,5 @@
1
- import { codeBlockType } from "./CodeBlockSpecs/index.js";
1
+ import { type LineNumbersOptions, codeBlockType } from "./CodeBlockSpecs/index.js";
2
2
  export { codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr } from "./CodeBlockSpecs/index.js";
3
3
  export declare const cbAction = "toCodeBlock";
4
4
  export { codeBlockType };
5
+ export declare const lineNumbersOptionsDefault: LineNumbersOptions;
@@ -2,4 +2,9 @@ import { codeBlockType } from "./CodeBlockSpecs/index.js";
2
2
  export { codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr } from "./CodeBlockSpecs/index.js";
3
3
  export const cbAction = 'toCodeBlock';
4
4
  export { codeBlockType };
5
+ // After changing the default, don't forget to update LineNumbersOptions
6
+ export const lineNumbersOptionsDefault = {
7
+ enabled: true,
8
+ showByDefault: false,
9
+ };
5
10
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,kCAAyB;AAE/C,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,IAAI,aAAa,EAAC,kCAAyB;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,CAAC","sourcesContent":["import {codeBlockType} from './CodeBlockSpecs';\n\nexport {codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr} from './CodeBlockSpecs';\nexport const cbAction = 'toCodeBlock';\nexport {codeBlockType};\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,aAAa,EAAC,kCAAyB;AAExE,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,IAAI,aAAa,EAAC,kCAAyB;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,CAAC;AAEvB,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAuB;IACzD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,KAAK;CACvB,CAAC","sourcesContent":["import {type LineNumbersOptions, codeBlockType} from './CodeBlockSpecs';\n\nexport {codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr} from './CodeBlockSpecs';\nexport const cbAction = 'toCodeBlock';\nexport {codeBlockType};\n\n// After changing the default, don't forget to update LineNumbersOptions\nexport const lineNumbersOptionsDefault: LineNumbersOptions = {\n enabled: true,\n showByDefault: false,\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"]}
@@ -1,6 +1,6 @@
1
1
  import type { Action, ExtensionAuto } from "../../../core/index.js";
2
2
  import { type HighlightLangMap } from "./CodeBlockHighlight/CodeBlockHighlight.js";
3
- import { type CodeBlockSpecsOptions, type LineNumbersOptions } from "./CodeBlockSpecs/index.js";
3
+ import { type CodeBlockSpecsOptions } from "./CodeBlockSpecs/index.js";
4
4
  import { cbAction } from "./const.js";
5
5
  export { resetCodeblock } from "./commands.js";
6
6
  export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlockSpecs/index.js";
@@ -8,7 +8,6 @@ export type CodeBlockOptions = CodeBlockSpecsOptions & {
8
8
  codeBlockKey?: string | null;
9
9
  langs?: HighlightLangMap;
10
10
  };
11
- export declare const lineNumbersOptionsDefault: LineNumbersOptions;
12
11
  export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
13
12
  declare global {
14
13
  namespace WysiwygEditor {
@@ -1,16 +1,14 @@
1
- // @ts-ignore // TODO: fix cjs build
2
- import { hasParentNodeOfType } from 'prosemirror-utils';
1
+ import { hasParentNodeOfType } from "../../../pm/utils.js";
3
2
  import { isFunction } from "../../../lodash.js";
4
3
  import { textblockTypeInputRule } from "../../../utils/inputrules.js";
5
4
  import { withLogAction } from "../../../utils/keymap.js";
6
5
  import { CodeBlockHighlight } from "./CodeBlockHighlight/CodeBlockHighlight.js";
7
- import { CodeBlockSpecs, } from "./CodeBlockSpecs/index.js";
6
+ import { CodeBlockSpecs } from "./CodeBlockSpecs/index.js";
8
7
  import { newlineInCode, resetCodeblock, setCodeBlockType } from "./commands.js";
9
- import { cbAction, codeBlockType } from "./const.js";
8
+ import { cbAction, codeBlockType, lineNumbersOptionsDefault } from "./const.js";
10
9
  import { codeBlockPastePlugin } from "./plugins/codeBlockPastePlugin.js";
11
10
  export { resetCodeblock } from "./commands.js";
12
11
  export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlockSpecs/index.js";
13
- export const lineNumbersOptionsDefault = { enabled: true, showByDefault: true };
14
12
  export const CodeBlock = (builder, opts) => {
15
13
  const optsNormalized = {
16
14
  ...opts,
@@ -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 {NodeType} from 'prosemirror-model';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNodeOfType} from 'prosemirror-utils';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {textblockTypeInputRule} from '../../../utils/inputrules';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {\n CodeBlockSpecs,\n type CodeBlockSpecsOptions,\n type LineNumbersOptions,\n} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType} 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 lineNumbersOptionsDefault: LineNumbersOptions = {enabled: true, showByDefault: true};\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};\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,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"]}
@@ -12,6 +12,7 @@ export declare function isFilesOnly({ types }: DataTransfer): boolean;
12
12
  export declare function isFilesFromHtml({ types }: DataTransfer): boolean;
13
13
  export declare function isImageFile(file: File): boolean;
14
14
  export declare function isVSCode(data: DataTransfer): boolean;
15
+ export declare function isJetBrains(data: DataTransfer): boolean;
15
16
  export type VSCodeData = {
16
17
  version: number;
17
18
  isFromEmptySelection: boolean;
@@ -23,6 +23,12 @@ export function isImageFile(file) {
23
23
  export function isVSCode(data) {
24
24
  return data.types.includes(DataTransferType.VSCodeData);
25
25
  }
26
+ export function isJetBrains(data) {
27
+ if (!data.types.includes(DataTransferType.Rtf))
28
+ return false;
29
+ const rtf = data.getData(DataTransferType.Rtf);
30
+ return rtf.indexOf('\\fmodern JetBrains') > 0;
31
+ }
26
32
  export function tryParseVSCodeData(data) {
27
33
  try {
28
34
  return JSON.parse(data.getData(DataTransferType.VSCodeData));
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAED,MAAM,UAAU,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAUD,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAED,MAAM,UAAU,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAUD,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport function isJetBrains(data: DataTransfer): boolean {\n if (!data.types.includes(DataTransferType.Rtf)) return false;\n const rtf = data.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\\\fmodern JetBrains') > 0;\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  /** During build process, the current version will be injected here */
2
- export const VERSION = typeof '15.30.0' !== 'undefined' ? '15.30.0' : 'unknown';
2
+ export const VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.30.0' !== 'undefined' ? '15.30.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/markdown-editor",
3
- "version": "15.30.0",
3
+ "version": "15.32.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {