@haklex/rich-editor 0.0.39 → 0.0.41
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/{RichEditor-BcbNmzGB.js → RichEditor-DnJwe663.js} +52 -7
- package/dist/components/RichEditor.d.ts.map +1 -1
- package/dist/editor.mjs +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +169 -9
- package/dist/plugins/BlockIdPlugin.d.ts +3 -0
- package/dist/plugins/BlockIdPlugin.d.ts.map +1 -0
- package/dist/utils/comment-anchor.d.ts +32 -0
- package/dist/utils/comment-anchor.d.ts.map +1 -0
- package/package.json +5 -5
|
@@ -13,7 +13,7 @@ import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
|
|
|
13
13
|
import { TabIndentationPlugin } from "@lexical/react/LexicalTabIndentationPlugin";
|
|
14
14
|
import { TablePlugin } from "@lexical/react/LexicalTablePlugin";
|
|
15
15
|
import { Y as $isAlertQuoteNode, d as RendererWrapper, Z as AlertRenderer, _ as SpoilerNode, T as MentionNode, a0 as FootnoteNode, O as KaTeXInlineNode, a1 as AlertQuoteNode, f as editorTheme, a2 as $isBannerNode, a3 as BannerRenderer, a4 as BannerNode, a5 as normalizeBannerType, a6 as $isCodeBlockNode, a7 as CodeBlockRenderer, a8 as CodeBlockNode, i as useFootnoteDefinitions, I as FootnoteSectionNode, v as $isGridContainerNode, K as GridContainerNode, b as builtinNodes, M as KaTeXBlockNode, L as ImageNode, a9 as VideoNode, Q as LinkCardNode, aa as DetailsNode, U as MermaidNode, F as FootnoteDefinitionsProvider, p as $createImageNode, W as computeImageMeta, V as OPEN_IMAGE_UPLOAD_DIALOG_COMMAND, ab as $createKaTeXInlineNode, ac as $createKaTeXBlockNode, ad as $createDetailsNode, ae as $createFootnoteNode, t as $isFootnoteSectionNode, $ as $createFootnoteSectionNode, r as $createMentionNode, g as extractTextContent, af as $createSpoilerNode, s as $createMermaidNode, C as ColorSchemeProvider, R as RendererConfigProvider } from "./theme-gVNBI_ET.js";
|
|
16
|
-
import { $getNodeByKey, KEY_ENTER_COMMAND, COMMAND_PRIORITY_CRITICAL, KEY_ARROW_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $getRoot, $createParagraphNode, $isParagraphNode, $getSelection, $isRangeSelection, $insertNodes, createEditor, $isElementNode, $isDecoratorNode, $createNodeSelection, $setSelection, $nodesOfType, createCommand, COMMAND_PRIORITY_EDITOR, $isRootNode, $isNodeSelection, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_ARROW_UP_COMMAND, $isTextNode, $parseSerializedNode, PASTE_COMMAND, $createTextNode, $createLineBreakNode } from "lexical";
|
|
16
|
+
import { $getNodeByKey, KEY_ENTER_COMMAND, COMMAND_PRIORITY_CRITICAL, KEY_ARROW_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $getRoot, $createParagraphNode, $isParagraphNode, $getSelection, $isRangeSelection, $insertNodes, createEditor, $isElementNode, $isDecoratorNode, $createNodeSelection, $setSelection, $nodesOfType, createCommand, COMMAND_PRIORITY_EDITOR, $isRootNode, $isNodeSelection, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_ARROW_UP_COMMAND, $isTextNode, createState, $getState, $addUpdateTag, $setState, $parseSerializedNode, PASTE_COMMAND, $createTextNode, $createLineBreakNode } from "lexical";
|
|
17
17
|
import { Info, Lightbulb, TriangleAlert, Flag, LayoutGrid, Plus, Minus, Check, Upload, Link2 } from "lucide-react";
|
|
18
18
|
import { useCallback, useEffect, createElement, useState, createContext, use, useRef, useMemo } from "react";
|
|
19
19
|
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
|
@@ -1326,6 +1326,49 @@ function BlockExitPlugin() {
|
|
|
1326
1326
|
}, [editor]);
|
|
1327
1327
|
return null;
|
|
1328
1328
|
}
|
|
1329
|
+
const blockIdState = createState("blockId", {
|
|
1330
|
+
parse: (v) => typeof v === "string" ? v : ""
|
|
1331
|
+
});
|
|
1332
|
+
const NORMALIZATION_TAG = "block-id-normalization";
|
|
1333
|
+
function BlockIdPlugin() {
|
|
1334
|
+
const [editor] = useLexicalComposerContext();
|
|
1335
|
+
useEffect(() => {
|
|
1336
|
+
return editor.registerUpdateListener(({ tags }) => {
|
|
1337
|
+
if (tags.has(NORMALIZATION_TAG)) return;
|
|
1338
|
+
editor.read(() => {
|
|
1339
|
+
const children = $getRoot().getChildren();
|
|
1340
|
+
let needsUpdate = false;
|
|
1341
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1342
|
+
for (const child of children) {
|
|
1343
|
+
const id = $getState(child, blockIdState);
|
|
1344
|
+
if (id === "" || seen.has(id)) {
|
|
1345
|
+
needsUpdate = true;
|
|
1346
|
+
break;
|
|
1347
|
+
}
|
|
1348
|
+
seen.add(id);
|
|
1349
|
+
}
|
|
1350
|
+
if (!needsUpdate) return;
|
|
1351
|
+
editor.update(
|
|
1352
|
+
() => {
|
|
1353
|
+
$addUpdateTag("history-merge");
|
|
1354
|
+
const children2 = $getRoot().getChildren();
|
|
1355
|
+
const seen2 = /* @__PURE__ */ new Set();
|
|
1356
|
+
for (const child of children2) {
|
|
1357
|
+
let id = $getState(child, blockIdState);
|
|
1358
|
+
if (id === "" || seen2.has(id)) {
|
|
1359
|
+
id = crypto.randomUUID();
|
|
1360
|
+
$setState(child, blockIdState, id);
|
|
1361
|
+
}
|
|
1362
|
+
seen2.add(id);
|
|
1363
|
+
}
|
|
1364
|
+
},
|
|
1365
|
+
{ tag: NORMALIZATION_TAG }
|
|
1366
|
+
);
|
|
1367
|
+
});
|
|
1368
|
+
});
|
|
1369
|
+
}, [editor]);
|
|
1370
|
+
return null;
|
|
1371
|
+
}
|
|
1329
1372
|
function EditorRefPlugin({ onEditorReady }) {
|
|
1330
1373
|
const [editor] = useLexicalComposerContext();
|
|
1331
1374
|
const callbackRef = useRef(onEditorReady);
|
|
@@ -2434,6 +2477,7 @@ function RichEditor({
|
|
|
2434
2477
|
/* @__PURE__ */ jsx(CheckListPlugin, {}),
|
|
2435
2478
|
/* @__PURE__ */ jsx(BlockExitPlugin, {}),
|
|
2436
2479
|
/* @__PURE__ */ jsx(AutoLinkPlugin, {}),
|
|
2480
|
+
/* @__PURE__ */ jsx(BlockIdPlugin, {}),
|
|
2437
2481
|
/* @__PURE__ */ jsx(EditorRefPlugin, { onEditorReady }),
|
|
2438
2482
|
autoFocus && /* @__PURE__ */ jsx(AutoFocusPlugin, {}),
|
|
2439
2483
|
children,
|
|
@@ -2451,14 +2495,15 @@ export {
|
|
|
2451
2495
|
NESTED_EDITOR_NODES as N,
|
|
2452
2496
|
RichEditor as R,
|
|
2453
2497
|
allEditNodes as a,
|
|
2454
|
-
|
|
2498
|
+
blockIdState as b,
|
|
2455
2499
|
customEditNodes as c,
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2500
|
+
FootnoteSectionEditNode as d,
|
|
2501
|
+
INSERT_IMAGE_COMMAND as e,
|
|
2502
|
+
INSERT_KATEX_BLOCK_COMMAND as f,
|
|
2459
2503
|
getResolvedEditNodes as g,
|
|
2460
|
-
|
|
2461
|
-
|
|
2504
|
+
INSERT_KATEX_INLINE_COMMAND as h,
|
|
2505
|
+
INSERT_MERMAID_COMMAND as i,
|
|
2506
|
+
defaultImageUpload as j,
|
|
2462
2507
|
setResolvedEditNodes as s,
|
|
2463
2508
|
useImageUpload as u
|
|
2464
2509
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichEditor.d.ts","sourceRoot":"","sources":["../../src/components/RichEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RichEditor.d.ts","sourceRoot":"","sources":["../../src/components/RichEditor.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAI/C,wBAAgB,UAAU,CAAC,EACzB,YAAY,EACZ,QAAQ,EACR,OAAmB,EACnB,KAAe,EACf,WAAkC,EAClC,QAAQ,EACR,SAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,QAAQ,GACT,EAAE,eAAe,+BA0EjB"}
|
package/dist/editor.mjs
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -69,4 +69,7 @@ export { NestedContentRendererProvider, useNestedContentRenderer, } from './cont
|
|
|
69
69
|
export type { FootnoteStaticRendererProps } from './components/renderers/FootnoteStaticRenderer';
|
|
70
70
|
export { FootnoteStaticRenderer } from './components/renderers/FootnoteStaticRenderer';
|
|
71
71
|
export { extractTextContent } from './utils/extractTextContent';
|
|
72
|
+
export { blockIdState } from './plugins/BlockIdPlugin';
|
|
73
|
+
export type { AnchorError, AnchorResult, BlockAnchor, CommentAnchor, RangeAnchor, } from './utils/comment-anchor';
|
|
74
|
+
export { buildBlockAnchor, buildRangeAnchor } from './utils/comment-anchor';
|
|
72
75
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAA;AAC3F,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAC7E,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGnE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAGpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAG5B,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGlE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAA;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAGhE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGhE,YAAY,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,YAAY,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AAGpC,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAG7E,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,YAAY,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAChF,YAAY,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACtF,YAAY,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAA;AAC1E,YAAY,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAA;AAClG,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,YAAY,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AACpF,YAAY,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAClF,YAAY,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAClF,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,YAAY,EACV,QAAQ,EACR,wBAAwB,GACzB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAA;AAC1E,YAAY,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC1E,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAG7E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGrE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,GACzB,MAAM,wCAAwC,CAAA;AAG/C,YAAY,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAGtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b as blockIdState } from "./RichEditor-DnJwe663.js";
|
|
2
|
+
import { A, F, d, I, e, f, h, i, N, R, a, c, j, g, s, u } from "./RichEditor-DnJwe663.js";
|
|
2
3
|
import { h as useFootnoteContent, j as useFootnoteDisplayNumber } from "./theme-gVNBI_ET.js";
|
|
3
|
-
import { $, o, p, q, r, s as s2, t, v, w, x, y, z, A as A2, B, D, E, G, H, C, F as F2, I as I2, J, K, L, M, O, P, Q, S, T, U, N as N2, V, a as a2, b
|
|
4
|
+
import { $, o, p, q, r, s as s2, t, v, w, x, y, z, A as A2, B, D, E, G, H, C, F as F2, I as I2, J, K, L, M, O, P, Q, S, T, U, N as N2, V, a as a2, b, W, e as e2, c as c2, X, f as f2, g as g2, u as u2, i as i2, k, l, m, n } from "./theme-gVNBI_ET.js";
|
|
4
5
|
import { a as a3, c as c3, g as g3, n as n2 } from "./utils-fpeaZV1R.js";
|
|
5
6
|
import { r as r2 } from "./shared.css-BqX4HjVE.js";
|
|
6
7
|
import { articleTheme, commentTheme, noteTheme, vars } from "@haklex/rich-style-token";
|
|
7
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
9
|
import { TooltipRoot, TooltipTrigger, TooltipContent } from "@haklex/rich-editor-ui";
|
|
9
10
|
import { useCallback } from "react";
|
|
11
|
+
import { $getRoot, $getSelection, $isRangeSelection, $getState, $isElementNode, $isTextNode, $isLineBreakNode } from "lexical";
|
|
10
12
|
function FootnoteRenderer({ identifier }) {
|
|
11
13
|
const content = useFootnoteContent(identifier);
|
|
12
14
|
const displayNumber = useFootnoteDisplayNumber(identifier);
|
|
@@ -49,6 +51,161 @@ function FootnoteRenderer({ identifier }) {
|
|
|
49
51
|
content ? /* @__PURE__ */ jsx(TooltipContent, { children: content }) : null
|
|
50
52
|
] }) });
|
|
51
53
|
}
|
|
54
|
+
function computeBlockFingerprint(block) {
|
|
55
|
+
const text = block.getTextContent();
|
|
56
|
+
const input = text.slice(0, 200) + String(text.length);
|
|
57
|
+
let hash = 5381;
|
|
58
|
+
for (let i3 = 0; i3 < input.length; i3++) {
|
|
59
|
+
hash = (hash << 5) + hash + (input.codePointAt(i3) ?? 0) | 0;
|
|
60
|
+
}
|
|
61
|
+
return (hash >>> 0).toString(16);
|
|
62
|
+
}
|
|
63
|
+
function $getRootBlock(node) {
|
|
64
|
+
const root = $getRoot();
|
|
65
|
+
let current = node;
|
|
66
|
+
while (current) {
|
|
67
|
+
const parent = current.getParent();
|
|
68
|
+
if (parent === root && "getChildren" in current) {
|
|
69
|
+
return current;
|
|
70
|
+
}
|
|
71
|
+
current = parent;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function $resolveSelectionPoint(selection, which) {
|
|
76
|
+
const point = selection[which];
|
|
77
|
+
const node = point.getNode();
|
|
78
|
+
if ($isElementNode(node)) {
|
|
79
|
+
const children = node.getChildren();
|
|
80
|
+
if (point.offset < children.length) {
|
|
81
|
+
return { node: children[point.offset], offset: 0 };
|
|
82
|
+
}
|
|
83
|
+
const last = children.at(-1);
|
|
84
|
+
if (last && $isTextNode(last)) {
|
|
85
|
+
return { node: last, offset: last.getTextContentSize() };
|
|
86
|
+
}
|
|
87
|
+
return { node, offset: 0 };
|
|
88
|
+
}
|
|
89
|
+
return { node, offset: point.offset };
|
|
90
|
+
}
|
|
91
|
+
function $getTextOffsetInBlock(block, targetNode, targetOffset) {
|
|
92
|
+
let offset = 0;
|
|
93
|
+
function walk(node) {
|
|
94
|
+
if (node.is(targetNode)) {
|
|
95
|
+
offset += targetOffset;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
if ($isTextNode(node)) {
|
|
99
|
+
offset += node.getTextContentSize();
|
|
100
|
+
} else if ($isLineBreakNode(node)) {
|
|
101
|
+
offset += 1;
|
|
102
|
+
} else if ($isElementNode(node)) {
|
|
103
|
+
for (const child of node.getChildren()) {
|
|
104
|
+
if (walk(child)) return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
for (const child of block.getChildren()) {
|
|
110
|
+
if (walk(child)) break;
|
|
111
|
+
}
|
|
112
|
+
return offset;
|
|
113
|
+
}
|
|
114
|
+
function $buildBlockAnchorData(block) {
|
|
115
|
+
const blockId = $getState(block, blockIdState);
|
|
116
|
+
if (!blockId) {
|
|
117
|
+
return { ok: false, error: "no-block-id" };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
ok: true,
|
|
121
|
+
anchor: {
|
|
122
|
+
mode: "block",
|
|
123
|
+
blockId,
|
|
124
|
+
blockType: block.getType(),
|
|
125
|
+
blockFingerprint: computeBlockFingerprint(block),
|
|
126
|
+
snapshotText: block.getTextContent().slice(0, 300)
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function buildBlockAnchor(editor, blockKey) {
|
|
131
|
+
return editor.read(() => {
|
|
132
|
+
if (blockKey) {
|
|
133
|
+
const node = $getRoot().getChildren().find((c4) => c4.getKey() === blockKey);
|
|
134
|
+
if (!node || !("getChildren" in node)) {
|
|
135
|
+
return { ok: false, error: "not-root-block" };
|
|
136
|
+
}
|
|
137
|
+
return $buildBlockAnchorData(node);
|
|
138
|
+
}
|
|
139
|
+
const selection = $getSelection();
|
|
140
|
+
if (!$isRangeSelection(selection)) {
|
|
141
|
+
return { ok: false, error: "no-selection" };
|
|
142
|
+
}
|
|
143
|
+
const anchorNode = selection.anchor.getNode();
|
|
144
|
+
const block = $getRootBlock(anchorNode);
|
|
145
|
+
if (!block) {
|
|
146
|
+
return { ok: false, error: "not-root-block" };
|
|
147
|
+
}
|
|
148
|
+
return $buildBlockAnchorData(block);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function buildRangeAnchor(editor) {
|
|
152
|
+
return editor.read(() => {
|
|
153
|
+
const selection = $getSelection();
|
|
154
|
+
if (!$isRangeSelection(selection)) {
|
|
155
|
+
return { ok: false, error: "no-selection" };
|
|
156
|
+
}
|
|
157
|
+
if (selection.isCollapsed()) {
|
|
158
|
+
return { ok: false, error: "collapsed" };
|
|
159
|
+
}
|
|
160
|
+
const anchorBlock = $getRootBlock(selection.anchor.getNode());
|
|
161
|
+
const focusBlock = $getRootBlock(selection.focus.getNode());
|
|
162
|
+
if (!anchorBlock || !focusBlock) {
|
|
163
|
+
return { ok: false, error: "not-root-block" };
|
|
164
|
+
}
|
|
165
|
+
if (anchorBlock !== focusBlock) {
|
|
166
|
+
return { ok: false, error: "cross-block" };
|
|
167
|
+
}
|
|
168
|
+
const block = anchorBlock;
|
|
169
|
+
const blockId = $getState(block, blockIdState);
|
|
170
|
+
if (!blockId) {
|
|
171
|
+
return { ok: false, error: "no-block-id" };
|
|
172
|
+
}
|
|
173
|
+
const anchorPoint = $resolveSelectionPoint(selection, "anchor");
|
|
174
|
+
const focusPoint = $resolveSelectionPoint(selection, "focus");
|
|
175
|
+
let startOffset = $getTextOffsetInBlock(
|
|
176
|
+
block,
|
|
177
|
+
anchorPoint.node,
|
|
178
|
+
anchorPoint.offset
|
|
179
|
+
);
|
|
180
|
+
let endOffset = $getTextOffsetInBlock(
|
|
181
|
+
block,
|
|
182
|
+
focusPoint.node,
|
|
183
|
+
focusPoint.offset
|
|
184
|
+
);
|
|
185
|
+
if (startOffset > endOffset) {
|
|
186
|
+
[startOffset, endOffset] = [endOffset, startOffset];
|
|
187
|
+
}
|
|
188
|
+
const text = block.getTextContent();
|
|
189
|
+
const quote = text.slice(startOffset, endOffset);
|
|
190
|
+
const prefix = text.slice(Math.max(0, startOffset - 50), startOffset);
|
|
191
|
+
const suffix = text.slice(endOffset, endOffset + 50);
|
|
192
|
+
return {
|
|
193
|
+
ok: true,
|
|
194
|
+
anchor: {
|
|
195
|
+
mode: "range",
|
|
196
|
+
blockId,
|
|
197
|
+
blockType: block.getType(),
|
|
198
|
+
blockFingerprint: computeBlockFingerprint(block),
|
|
199
|
+
snapshotText: text.slice(0, 300),
|
|
200
|
+
quote,
|
|
201
|
+
prefix,
|
|
202
|
+
suffix,
|
|
203
|
+
startOffset,
|
|
204
|
+
endOffset
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
}
|
|
52
209
|
export {
|
|
53
210
|
$ as $createFootnoteSectionNode,
|
|
54
211
|
o as $createGridContainerNode,
|
|
@@ -73,15 +230,15 @@ export {
|
|
|
73
230
|
F2 as FootnoteDefinitionsProvider,
|
|
74
231
|
F as FootnotePlugin,
|
|
75
232
|
FootnoteRenderer,
|
|
76
|
-
|
|
233
|
+
d as FootnoteSectionEditNode,
|
|
77
234
|
I2 as FootnoteSectionNode,
|
|
78
235
|
J as FootnoteStaticRenderer,
|
|
79
236
|
K as GridContainerNode,
|
|
80
237
|
I as INSERT_ALERT_COMMAND,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
238
|
+
e as INSERT_IMAGE_COMMAND,
|
|
239
|
+
f as INSERT_KATEX_BLOCK_COMMAND,
|
|
240
|
+
h as INSERT_KATEX_INLINE_COMMAND,
|
|
241
|
+
i as INSERT_MERMAID_COMMAND,
|
|
85
242
|
L as ImageNode,
|
|
86
243
|
M as KaTeXBlockNode,
|
|
87
244
|
O as KaTeXInlineNode,
|
|
@@ -98,7 +255,10 @@ export {
|
|
|
98
255
|
a2 as allNodes,
|
|
99
256
|
articleTheme,
|
|
100
257
|
a3 as articleVariant,
|
|
101
|
-
|
|
258
|
+
blockIdState,
|
|
259
|
+
buildBlockAnchor,
|
|
260
|
+
buildRangeAnchor,
|
|
261
|
+
b as builtinNodes,
|
|
102
262
|
commentTheme,
|
|
103
263
|
c3 as commentVariant,
|
|
104
264
|
W as computeImageMeta,
|
|
@@ -106,7 +266,7 @@ export {
|
|
|
106
266
|
c as customEditNodes,
|
|
107
267
|
c2 as customNodes,
|
|
108
268
|
X as decodeThumbHash,
|
|
109
|
-
|
|
269
|
+
j as defaultImageUpload,
|
|
110
270
|
f2 as editorTheme,
|
|
111
271
|
g2 as extractTextContent,
|
|
112
272
|
g as getResolvedEditNodes,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockIdPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/BlockIdPlugin.tsx"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,kDAEvB,CAAA;AAIF,wBAAgB,aAAa,SA6C5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LexicalEditor } from 'lexical';
|
|
2
|
+
export interface BlockAnchor {
|
|
3
|
+
mode: 'block';
|
|
4
|
+
blockId: string;
|
|
5
|
+
blockType: string;
|
|
6
|
+
blockFingerprint: string;
|
|
7
|
+
snapshotText: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RangeAnchor {
|
|
10
|
+
mode: 'range';
|
|
11
|
+
blockId: string;
|
|
12
|
+
blockType: string;
|
|
13
|
+
blockFingerprint: string;
|
|
14
|
+
snapshotText: string;
|
|
15
|
+
quote: string;
|
|
16
|
+
prefix: string;
|
|
17
|
+
suffix: string;
|
|
18
|
+
startOffset: number;
|
|
19
|
+
endOffset: number;
|
|
20
|
+
}
|
|
21
|
+
export type CommentAnchor = BlockAnchor | RangeAnchor;
|
|
22
|
+
export type AnchorError = 'no-selection' | 'cross-block' | 'collapsed' | 'no-block-id' | 'not-root-block';
|
|
23
|
+
export type AnchorResult<T> = {
|
|
24
|
+
ok: true;
|
|
25
|
+
anchor: T;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: AnchorError;
|
|
29
|
+
};
|
|
30
|
+
export declare function buildBlockAnchor(editor: LexicalEditor, blockKey?: string): AnchorResult<BlockAnchor>;
|
|
31
|
+
export declare function buildRangeAnchor(editor: LexicalEditor): AnchorResult<RangeAnchor>;
|
|
32
|
+
//# sourceMappingURL=comment-anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-anchor.d.ts","sourceRoot":"","sources":["../../src/utils/comment-anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAGd,MAAM,SAAS,CAAA;AAahB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAA;AAErD,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,aAAa,GACb,WAAW,GACX,aAAa,GACb,gBAAgB,CAAA;AAEpB,MAAM,MAAM,YAAY,CAAC,CAAC,IACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACvB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAgGrC,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,CAAC,WAAW,CAAC,CAyB3B;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,GACpB,YAAY,CAAC,WAAW,CAAC,CAmE3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haklex/rich-editor",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.41",
|
|
4
4
|
"description": "Core rich text editor based on Lexical",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"thumbhash": "^0.1.1",
|
|
32
|
-
"@haklex/rich-
|
|
33
|
-
"@haklex/rich-
|
|
34
|
-
"@haklex/rich-
|
|
32
|
+
"@haklex/rich-editor-ui": "0.0.41",
|
|
33
|
+
"@haklex/rich-style-token": "0.0.41",
|
|
34
|
+
"@haklex/rich-headless": "0.0.41"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@base-ui/react": "^1.2.0",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"lucide-react": "^0.574.0",
|
|
53
53
|
"react": "^19.2.4",
|
|
54
54
|
"react-dom": "^19.2.4",
|
|
55
|
-
"shiki": "^3.
|
|
55
|
+
"shiki": "^3.23.0",
|
|
56
56
|
"typescript": "^5.9.3",
|
|
57
57
|
"vite": "^7.3.1",
|
|
58
58
|
"vite-plugin-dts": "^4.5.4"
|