@ctzhian/tiptap 1.13.9 → 2.1.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.
- package/dist/Editor/demo.js +133 -123
- package/dist/Editor/index.js +17 -0
- package/dist/EditorToolbar/index.js +11 -9
- package/dist/asset/css/index.css +5 -7
- package/dist/component/ActionDropdown/index.d.ts +5 -0
- package/dist/component/ActionDropdown/index.js +8 -3
- package/dist/component/CustomBubbleMenu/index.js +1 -1
- package/dist/component/CustomDragHandle/index.js +3 -59
- package/dist/component/FloatingPopover/index.d.ts +2 -2
- package/dist/component/HoverPopover/index.d.ts +2 -0
- package/dist/component/HoverPopover/index.js +22 -3
- package/dist/component/Icons/delete-back-2-line-icon.d.ts +6 -0
- package/dist/component/Icons/delete-back-2-line-icon.js +13 -0
- package/dist/component/Icons/{expand-horizontal-line.js → expand-horizontal-line-icon.js} +1 -1
- package/dist/component/Icons/index.d.ts +3 -2
- package/dist/component/Icons/index.js +4 -3
- package/dist/component/Menu/index.js +5 -1
- package/dist/contants/enums.d.ts +9 -0
- package/dist/contants/enums.js +61 -1
- package/dist/extension/component/Alert/index.js +141 -137
- package/dist/extension/component/Flow/Edit.d.ts +1 -1
- package/dist/extension/component/Flow/Edit.js +3 -31
- package/dist/extension/component/Flow/index.js +20 -19
- package/dist/extension/component/Image/index.d.ts +1 -0
- package/dist/extension/component/Image/index.js +16 -2
- package/dist/extension/component/Link/index.js +1 -1
- package/dist/extension/component/TableCellHandleMenu/index.d.ts +9 -0
- package/dist/extension/component/TableCellHandleMenu/index.js +500 -0
- package/dist/extension/component/TableExtendButton/TableExtendButton.css +30 -0
- package/dist/extension/component/TableExtendButton/index.d.ts +23 -0
- package/dist/extension/component/TableExtendButton/index.js +201 -0
- package/dist/extension/component/TableExtendButton/use-table-extend-row-column.d.ts +15 -0
- package/dist/extension/component/TableExtendButton/use-table-extend-row-column.js +87 -0
- package/dist/extension/component/TableHandle/TableHandleMenu.css +36 -0
- package/dist/extension/component/TableHandle/TableHandleMenu.d.ts +17 -0
- package/dist/extension/component/TableHandle/TableHandleMenu.js +685 -0
- package/dist/extension/component/TableHandle/index.d.ts +28 -0
- package/dist/extension/component/TableHandle/index.js +93 -0
- package/dist/extension/component/TableHandle/use-table-handle-positioning.d.ts +40 -0
- package/dist/extension/component/TableHandle/use-table-handle-positioning.js +193 -0
- package/dist/extension/component/TableHandle/use-table-handle-state.d.ts +22 -0
- package/dist/extension/component/TableHandle/use-table-handle-state.js +45 -0
- package/dist/extension/component/TableSelectionOverlay/index.d.ts +16 -0
- package/dist/extension/component/TableSelectionOverlay/index.js +452 -0
- package/dist/extension/component/Video/Insert.js +4 -2
- package/dist/extension/component/Video/Readonly.js +4 -11
- package/dist/extension/component/Video/index.d.ts +2 -1
- package/dist/extension/component/Video/index.js +447 -65
- package/dist/extension/extension/ImeComposition.d.ts +2 -0
- package/dist/extension/extension/ImeComposition.js +145 -0
- package/dist/extension/extension/index.d.ts +1 -0
- package/dist/extension/extension/index.js +1 -0
- package/dist/extension/index.js +2 -2
- package/dist/extension/node/FileHandler.d.ts +1 -1
- package/dist/extension/node/Flow/index.d.ts +0 -3
- package/dist/extension/node/Flow/index.js +7 -4
- package/dist/extension/node/Link/index.js +4 -3
- package/dist/extension/node/Table.js +236 -117
- package/dist/extension/node/TableHandler/create-image.d.ts +9 -0
- package/dist/extension/node/TableHandler/create-image.js +235 -0
- package/dist/extension/node/TableHandler/index.d.ts +15 -0
- package/dist/extension/node/TableHandler/index.js +33 -0
- package/dist/extension/node/TableHandler/plugin.d.ts +49 -0
- package/dist/extension/node/TableHandler/plugin.js +1030 -0
- package/dist/extension/node/TableOfContents/index.d.ts +5 -3
- package/dist/extension/node/TableOfContents/index.js +22 -2
- package/dist/extension/node/Video.d.ts +1 -0
- package/dist/extension/node/Video.js +38 -6
- package/dist/hook/index.js +1 -1
- package/dist/index.css +45 -29
- package/dist/type/index.d.ts +2 -0
- package/dist/util/index.d.ts +9 -0
- package/dist/util/index.js +26 -0
- package/dist/util/table-utils.d.ts +161 -0
- package/dist/util/table-utils.js +605 -0
- package/package.json +2 -1
- package/dist/extension/component/Table/ContextMenu.d.ts +0 -11
- package/dist/extension/component/Table/ContextMenu.js +0 -186
- package/dist/extension/component/Table/TableContextMenuPlugin.d.ts +0 -9
- package/dist/extension/component/Table/TableContextMenuPlugin.js +0 -336
- package/dist/extension/component/Table/index.d.ts +0 -2
- package/dist/extension/component/Table/index.js +0 -2
- /package/dist/component/Icons/{expand-horizontal-line.d.ts → expand-horizontal-line-icon.d.ts} +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
3
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
4
|
+
import { Extension } from '@tiptap/core';
|
|
5
|
+
import { Plugin, PluginKey } from '@tiptap/pm/state';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Extension to fix IME (Input Method Editor) composition issues
|
|
9
|
+
*
|
|
10
|
+
* This extension provides basic IME composition support by tracking composition state
|
|
11
|
+
* and preventing keyboard handlers from interrupting IME input.
|
|
12
|
+
*
|
|
13
|
+
* Also fixes Safari-specific issue where composition text is deleted after composition ends.
|
|
14
|
+
* This Safari bug occurs at any input position (not just in tables), so this extension
|
|
15
|
+
* provides a global fix for all editor instances.
|
|
16
|
+
*/
|
|
17
|
+
var imeCompositionPluginKey = new PluginKey('imeComposition');
|
|
18
|
+
export var ImeComposition = Extension.create({
|
|
19
|
+
name: 'imeComposition',
|
|
20
|
+
addProseMirrorPlugins: function addProseMirrorPlugins() {
|
|
21
|
+
var ZERO_WIDTH_SPACE = "\u200B";
|
|
22
|
+
|
|
23
|
+
// 检测是否为 Safari 浏览器
|
|
24
|
+
var isSafari = function () {
|
|
25
|
+
if (typeof navigator === 'undefined') return false;
|
|
26
|
+
var ua = navigator.userAgent;
|
|
27
|
+
var isAppleMobile = /iP(ad|hone|od)/.test(ua);
|
|
28
|
+
var isMacSafari = /Safari\//.test(ua) && !/Chrome\//.test(ua);
|
|
29
|
+
return isAppleMobile || isMacSafari;
|
|
30
|
+
}();
|
|
31
|
+
|
|
32
|
+
// 判断是否为文本节点
|
|
33
|
+
var isTextNode = function isTextNode(node) {
|
|
34
|
+
return !!node && node.nodeType === 3;
|
|
35
|
+
};
|
|
36
|
+
return [new Plugin({
|
|
37
|
+
key: imeCompositionPluginKey,
|
|
38
|
+
state: {
|
|
39
|
+
init: function init() {
|
|
40
|
+
return {
|
|
41
|
+
isComposing: false
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
apply: function apply(tr, value) {
|
|
45
|
+
// 从 transaction meta 中获取组合状态
|
|
46
|
+
var meta = tr.getMeta(imeCompositionPluginKey);
|
|
47
|
+
if (meta) {
|
|
48
|
+
return {
|
|
49
|
+
isComposing: meta.isComposing
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
props: {
|
|
56
|
+
handleKeyDown: function handleKeyDown(view, event) {
|
|
57
|
+
var pluginState = imeCompositionPluginKey.getState(view.state);
|
|
58
|
+
// 如果正在输入法组合中,不处理键盘事件
|
|
59
|
+
// 检查 event.isComposing 和插件状态,确保 IME 输入不被键盘处理器打断
|
|
60
|
+
if (event.isComposing || pluginState !== null && pluginState !== void 0 && pluginState.isComposing) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
},
|
|
65
|
+
handleDOMEvents: {
|
|
66
|
+
// 监听输入法组合开始事件
|
|
67
|
+
compositionstart: function compositionstart(view, event) {
|
|
68
|
+
var state = view.state,
|
|
69
|
+
dispatch = view.dispatch;
|
|
70
|
+
var tr = state.tr.setMeta(imeCompositionPluginKey, {
|
|
71
|
+
isComposing: true
|
|
72
|
+
}).setMeta('composition', true);
|
|
73
|
+
dispatch(tr);
|
|
74
|
+
return false;
|
|
75
|
+
},
|
|
76
|
+
// 监听输入法组合结束事件
|
|
77
|
+
compositionend: function compositionend(view, event) {
|
|
78
|
+
var state = view.state,
|
|
79
|
+
dispatch = view.dispatch;
|
|
80
|
+
var tr = state.tr.setMeta(imeCompositionPluginKey, {
|
|
81
|
+
isComposing: false
|
|
82
|
+
}).setMeta('composition', false);
|
|
83
|
+
dispatch(tr);
|
|
84
|
+
return false;
|
|
85
|
+
},
|
|
86
|
+
// Safari 特定的修复:处理中文合成结束后触发的删除合成文本行为
|
|
87
|
+
// 这个问题在 Safari 中会在任意输入位置出现,不仅仅是 table
|
|
88
|
+
beforeinput: isSafari ? function (view, event) {
|
|
89
|
+
// 仅处理 Safari 在中文合成结束后触发的删除合成文本行为
|
|
90
|
+
var inputEvent = event;
|
|
91
|
+
if (inputEvent.inputType !== 'deleteCompositionText') {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
var selection = window.getSelection();
|
|
95
|
+
if (!selection || selection.rangeCount === 0) return false;
|
|
96
|
+
var range = selection.getRangeAt(0);
|
|
97
|
+
var startContainer = range.startContainer,
|
|
98
|
+
endContainer = range.endContainer,
|
|
99
|
+
startOffset = range.startOffset,
|
|
100
|
+
endOffset = range.endOffset;
|
|
101
|
+
|
|
102
|
+
// 如果选中的是整个文本节点,在节点前插入零宽空格防止被删除
|
|
103
|
+
if (isTextNode(startContainer) && startContainer === endContainer && startOffset === 0 && endOffset === startContainer.length) {
|
|
104
|
+
var _startContainer$paren;
|
|
105
|
+
(_startContainer$paren = startContainer.parentElement) === null || _startContainer$paren === void 0 || _startContainer$paren.insertBefore(document.createTextNode(ZERO_WIDTH_SPACE), startContainer);
|
|
106
|
+
}
|
|
107
|
+
// 让 ProseMirror 照常处理
|
|
108
|
+
return false;
|
|
109
|
+
} : undefined,
|
|
110
|
+
// Safari 特定的修复:清理零宽空格
|
|
111
|
+
input: isSafari ? function (view, event) {
|
|
112
|
+
var inputEvent = event;
|
|
113
|
+
if (inputEvent.inputType !== 'deleteCompositionText') {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
var selection = window.getSelection();
|
|
117
|
+
if (!selection || selection.rangeCount === 0) return false;
|
|
118
|
+
var range = selection.getRangeAt(0);
|
|
119
|
+
var node = range.startContainer;
|
|
120
|
+
var parentEl = (node === null || node === void 0 ? void 0 : node.parentElement) || null;
|
|
121
|
+
if (!parentEl) return false;
|
|
122
|
+
var textNodes = Array.from(parentEl.childNodes).filter(isTextNode);
|
|
123
|
+
var _iterator = _createForOfIteratorHelper(textNodes),
|
|
124
|
+
_step;
|
|
125
|
+
try {
|
|
126
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
127
|
+
var textNode = _step.value;
|
|
128
|
+
if (textNode.textContent === ZERO_WIDTH_SPACE) {
|
|
129
|
+
textNode.remove();
|
|
130
|
+
} else if (textNode.textContent && textNode.textContent.includes(ZERO_WIDTH_SPACE)) {
|
|
131
|
+
textNode.textContent = textNode.textContent.split(ZERO_WIDTH_SPACE).join('');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
_iterator.e(err);
|
|
136
|
+
} finally {
|
|
137
|
+
_iterator.f();
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
} : undefined
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
})];
|
|
144
|
+
}
|
|
145
|
+
});
|
package/dist/extension/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { CharacterCount, Placeholder } from '@tiptap/extensions';
|
|
|
12
12
|
import { Markdown } from '@tiptap/markdown';
|
|
13
13
|
import StarterKit from '@tiptap/starter-kit';
|
|
14
14
|
import { PLACEHOLDER } from "../contants/placeholder";
|
|
15
|
-
import { AiWritingExtension, SlashCommands, StructuredDiffExtension } from "./extension";
|
|
15
|
+
import { AiWritingExtension, ImeComposition, SlashCommands, StructuredDiffExtension } from "./extension";
|
|
16
16
|
import { CodeExtension } from "./mark/Code";
|
|
17
17
|
import { AlertExtension, AudioExtension, BlockAttachmentExtension, BlockLinkExtension, CodeBlockLowlightExtension, CustomBlockMathExtension, CustomHorizontalRule, CustomInlineMathExtension, CustomSubscript, CustomSuperscript, DetailsContentExtension, DetailsExtension, DetailsSummaryExtension, EmojiExtension, FileHandlerExtension, FlowExtension, IframeExtension, ImageExtension, Indent, InlineAttachmentExtension, InlineLinkExtension, InlineUploadProgressExtension, ListExtension, MentionExtension, TableExtension, TableOfContentsExtension, UploadProgressExtension, VerticalAlign, VideoExtension, YamlFormat, YoutubeExtension } from "./node";
|
|
18
18
|
export var getExtensions = function getExtensions(_ref) {
|
|
@@ -30,7 +30,7 @@ export var getExtensions = function getExtensions(_ref) {
|
|
|
30
30
|
onAiWritingGetSuggestion = _ref.onAiWritingGetSuggestion,
|
|
31
31
|
onValidateUrl = _ref.onValidateUrl,
|
|
32
32
|
_placeholder = _ref.placeholder;
|
|
33
|
-
var defaultExtensions = [StarterKit.configure({
|
|
33
|
+
var defaultExtensions = [ImeComposition, StarterKit.configure({
|
|
34
34
|
link: false,
|
|
35
35
|
code: false,
|
|
36
36
|
codeBlock: false,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { UploadFunction } from "../../type";
|
|
2
2
|
export declare const FileHandlerExtension: (props: {
|
|
3
3
|
onUpload?: UploadFunction;
|
|
4
|
-
}) => import("@tiptap/core").Extension<Omit<import("@tiptap/extension-file-handler").FileHandlePluginOptions, "
|
|
4
|
+
}) => import("@tiptap/core").Extension<Omit<import("@tiptap/extension-file-handler").FileHandlePluginOptions, "key" | "editor">, any>;
|
|
@@ -16,6 +16,9 @@ export var FlowExtension = function FlowExtension(props) {
|
|
|
16
16
|
draggable: true,
|
|
17
17
|
addAttributes: function addAttributes() {
|
|
18
18
|
return {
|
|
19
|
+
class: {
|
|
20
|
+
default: 'flow-wrapper'
|
|
21
|
+
},
|
|
19
22
|
code: {
|
|
20
23
|
default: '',
|
|
21
24
|
parseHTML: function parseHTML(element) {
|
|
@@ -29,9 +32,9 @@ export var FlowExtension = function FlowExtension(props) {
|
|
|
29
32
|
}
|
|
30
33
|
},
|
|
31
34
|
width: {
|
|
32
|
-
default:
|
|
35
|
+
default: null,
|
|
33
36
|
parseHTML: function parseHTML(element) {
|
|
34
|
-
return element.getAttribute('data-width') ||
|
|
37
|
+
return element.getAttribute('data-width') || null;
|
|
35
38
|
},
|
|
36
39
|
renderHTML: function renderHTML(attributes) {
|
|
37
40
|
if (!attributes.width) return {};
|
|
@@ -48,7 +51,7 @@ export var FlowExtension = function FlowExtension(props) {
|
|
|
48
51
|
getAttrs: function getAttrs(dom) {
|
|
49
52
|
if (!(dom instanceof HTMLElement)) return false;
|
|
50
53
|
var code = dom.getAttribute('data-code') || '';
|
|
51
|
-
var width = dom.getAttribute('data-width') ||
|
|
54
|
+
var width = dom.getAttribute('data-width') || null;
|
|
52
55
|
return {
|
|
53
56
|
code: code,
|
|
54
57
|
width: width
|
|
@@ -84,7 +87,7 @@ export var FlowExtension = function FlowExtension(props) {
|
|
|
84
87
|
type: _this.name,
|
|
85
88
|
attrs: {
|
|
86
89
|
code: options.code || '',
|
|
87
|
-
width: options.width ||
|
|
90
|
+
width: options.width || null
|
|
88
91
|
}
|
|
89
92
|
});
|
|
90
93
|
};
|
|
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
4
4
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
5
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
6
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
-
import { getLinkTitle } from "../../../util";
|
|
7
|
+
import { getLinkAttributesWithSelectedText, getLinkTitle } from "../../../util";
|
|
8
8
|
import { mergeAttributes, Node, nodePasteRule } from '@tiptap/core';
|
|
9
9
|
import { Plugin, PluginKey } from '@tiptap/pm/state';
|
|
10
10
|
import { ReactNodeViewRenderer } from '@tiptap/react';
|
|
@@ -361,10 +361,11 @@ export var InlineLinkExtension = Node.create({
|
|
|
361
361
|
var _this6 = this;
|
|
362
362
|
return {
|
|
363
363
|
'Mod-1': function Mod1() {
|
|
364
|
-
|
|
364
|
+
var linkAttributes = getLinkAttributesWithSelectedText(_this6.editor);
|
|
365
|
+
return _this6.editor.commands.setInlineLink(_objectSpread({
|
|
365
366
|
href: '',
|
|
366
367
|
type: 'icon'
|
|
367
|
-
});
|
|
368
|
+
}, linkAttributes));
|
|
368
369
|
}
|
|
369
370
|
};
|
|
370
371
|
},
|