@gravity-ui/markdown-editor 15.31.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.
@@ -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,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.31.0' !== 'undefined' ? '15.31.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.31.0' !== 'undefined' ? '15.31.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"]}
@@ -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,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":"AAAA,OAAO,EAAC,QAAQ,EAA0B,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAC,SAAS,EAAC,sCAA8B;AAChD,OAAO,EAAC,iBAAiB,EAAC,gCAAwB;AAElD,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAC,mBAAgB;AAE1F,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;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAY;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5D,IAAI,IAAI,GAAgB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAU;IAChC,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IAE3B,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC;QAC9D,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC;QAC/D,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,gBAAgB,CAAC,MAAM,CAAC;QACvF,OAAO,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE5C,OAAO,KAAK,CAAC;AACjB,CAAC","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.31.0' !== 'undefined' ? '15.31.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.31.0' !== 'undefined' ? '15.31.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.31.0",
3
+ "version": "15.32.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {