@lobehub/editor 1.14.0 → 1.14.2
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/es/const/hotkey.js
CHANGED
|
@@ -55,4 +55,9 @@ export var HOTKEYS_REGISTRATION = [{
|
|
|
55
55
|
keys: combineKeys([KeyEnum.Mod, KeyEnum.Shift, '8']),
|
|
56
56
|
priority: COMMAND_PRIORITY_EDITOR,
|
|
57
57
|
scopes: [HotkeyScopeEnum.Insert, HotkeyScopeEnum.Plugin]
|
|
58
|
+
}, {
|
|
59
|
+
id: HotkeyEnum.PasteAsPlainText,
|
|
60
|
+
keys: combineKeys([KeyEnum.Mod, KeyEnum.Shift, 'v']),
|
|
61
|
+
priority: COMMAND_PRIORITY_EDITOR,
|
|
62
|
+
scopes: [HotkeyScopeEnum.Format]
|
|
58
63
|
}];
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
3
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
4
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
1
5
|
import { $isCodeHighlightNode, $isCodeNode } from '@lexical/code';
|
|
2
6
|
import { $isHeadingNode } from '@lexical/rich-text';
|
|
3
7
|
import { mergeRegister } from '@lexical/utils';
|
|
@@ -136,7 +140,39 @@ export function registerRichKeydown(editor, kernel, options) {
|
|
|
136
140
|
var _ref = options || {},
|
|
137
141
|
_ref$enableHotkey = _ref.enableHotkey,
|
|
138
142
|
enableHotkey = _ref$enableHotkey === void 0 ? true : _ref$enableHotkey;
|
|
139
|
-
return mergeRegister(kernel.registerHotkey(HotkeyEnum.
|
|
143
|
+
return mergeRegister(kernel.registerHotkey(HotkeyEnum.PasteAsPlainText, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
144
|
+
var text;
|
|
145
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
146
|
+
while (1) switch (_context.prev = _context.next) {
|
|
147
|
+
case 0:
|
|
148
|
+
_context.prev = 0;
|
|
149
|
+
_context.next = 3;
|
|
150
|
+
return navigator.clipboard.readText();
|
|
151
|
+
case 3:
|
|
152
|
+
text = _context.sent;
|
|
153
|
+
editor.update(function () {
|
|
154
|
+
var selection = $getSelection();
|
|
155
|
+
if (!$isRangeSelection(selection)) return;
|
|
156
|
+
|
|
157
|
+
// Simply insert the plain text
|
|
158
|
+
selection.insertText(text);
|
|
159
|
+
});
|
|
160
|
+
_context.next = 10;
|
|
161
|
+
break;
|
|
162
|
+
case 7:
|
|
163
|
+
_context.prev = 7;
|
|
164
|
+
_context.t0 = _context["catch"](0);
|
|
165
|
+
console.error('Failed to paste as plain text:', _context.t0);
|
|
166
|
+
case 10:
|
|
167
|
+
case "end":
|
|
168
|
+
return _context.stop();
|
|
169
|
+
}
|
|
170
|
+
}, _callee, null, [[0, 7]]);
|
|
171
|
+
})), {
|
|
172
|
+
enabled: enableHotkey,
|
|
173
|
+
preventDefault: true,
|
|
174
|
+
stopPropagation: true
|
|
175
|
+
}), kernel.registerHotkey(HotkeyEnum.Bold, function () {
|
|
140
176
|
return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');
|
|
141
177
|
}, {
|
|
142
178
|
enabled: enableHotkey,
|
|
@@ -293,8 +329,8 @@ export function registerRichKeydown(editor, kernel, options) {
|
|
|
293
329
|
var NEEDS_FOLLOWING_PARAGRAPH_TYPES = new Set(['code', 'table']);
|
|
294
330
|
export function registerLastElement(editor) {
|
|
295
331
|
var isProcessing = false;
|
|
296
|
-
return editor.registerUpdateListener(function (
|
|
297
|
-
var dirtyElements =
|
|
332
|
+
return editor.registerUpdateListener(function (_ref3) {
|
|
333
|
+
var dirtyElements = _ref3.dirtyElements;
|
|
298
334
|
// Only process when root node or its direct children have changes
|
|
299
335
|
if (!dirtyElements.has('root') && !Array.from(dirtyElements.keys()).some(function (key) {
|
|
300
336
|
var _node$getParent;
|
|
@@ -16,6 +16,7 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
|
|
|
16
16
|
import { $isCodeNode } from '@lexical/code';
|
|
17
17
|
import { $getNodeByKey, $getSelection, $isRangeSelection, $isTextNode, COLLABORATION_TAG, COMMAND_PRIORITY_CRITICAL, HISTORIC_TAG, KEY_ENTER_COMMAND, PASTE_COMMAND } from 'lexical';
|
|
18
18
|
import { KernelPlugin } from "../../../editor-kernel/plugin";
|
|
19
|
+
import { createDebugLogger } from "../../../utils/debug";
|
|
19
20
|
import MarkdownDataSource from "../data-source/markdown-data-source";
|
|
20
21
|
import { parseMarkdownToLexical } from "../data-source/markdown/parse";
|
|
21
22
|
import { IMarkdownShortCutService, MarkdownShortCutService } from "../service/shortcut";
|
|
@@ -30,6 +31,7 @@ export var MarkdownPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
30
31
|
var _this;
|
|
31
32
|
_classCallCheck(this, MarkdownPlugin);
|
|
32
33
|
_this = _super.call(this);
|
|
34
|
+
_defineProperty(_assertThisInitialized(_this), "logger", createDebugLogger('plugin', 'markdown'));
|
|
33
35
|
_defineProperty(_assertThisInitialized(_this), "service", void 0);
|
|
34
36
|
_this.kernel = kernel;
|
|
35
37
|
_this.service = new MarkdownShortCutService(kernel);
|
|
@@ -123,15 +125,24 @@ export var MarkdownPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
123
125
|
var clipboardData = event.clipboardData;
|
|
124
126
|
if (!clipboardData) return false;
|
|
125
127
|
|
|
126
|
-
// Get
|
|
128
|
+
// Get clipboard content
|
|
127
129
|
var text = clipboardData.getData('text/plain');
|
|
128
130
|
var html = clipboardData.getData('text/html');
|
|
131
|
+
|
|
132
|
+
// If there's no text content, let Lexical handle it
|
|
129
133
|
if (!text) return false;
|
|
130
134
|
|
|
131
|
-
//
|
|
135
|
+
// If there's HTML content, it's a rich text paste
|
|
136
|
+
// Let Lexical's rich text handler process it
|
|
137
|
+
if (html && html.trim()) {
|
|
138
|
+
_this2.logger.debug('paste content analysis: HTML detected, letting Lexical handle it');
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Only handle plain text paste - check for markdown patterns
|
|
132
143
|
var hasMarkdownContent = _this2.detectMarkdownContent(text);
|
|
133
|
-
|
|
134
|
-
hasHTML:
|
|
144
|
+
_this2.logger.debug('paste content analysis:', {
|
|
145
|
+
hasHTML: false,
|
|
135
146
|
hasMarkdown: hasMarkdownContent,
|
|
136
147
|
markdownPatterns: _this2.getMarkdownPatterns(text),
|
|
137
148
|
text: text.slice(0, 100) + (text.length > 100 ? '...' : '')
|
|
@@ -247,7 +258,7 @@ export var MarkdownPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
247
258
|
$insertGeneratedNodes(editor, nodes, selection);
|
|
248
259
|
return true;
|
|
249
260
|
} catch (error) {
|
|
250
|
-
|
|
261
|
+
this.logger.error('Failed to handle markdown paste:', error);
|
|
251
262
|
}
|
|
252
263
|
return false;
|
|
253
264
|
}
|
package/es/types/hotkey.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export declare const HotkeyEnum: {
|
|
|
43
43
|
readonly Link: "link";
|
|
44
44
|
readonly Mention: "mention";
|
|
45
45
|
readonly NumberList: "numberList";
|
|
46
|
+
readonly PasteAsPlainText: "pasteAsPlainText";
|
|
46
47
|
readonly Redo: "redo";
|
|
47
48
|
readonly Slash: "slash";
|
|
48
49
|
readonly Strikethrough: "strikethrough";
|
package/es/types/hotkey.js
CHANGED
package/package.json
CHANGED