@maketribe/ms-app 3.2.40 → 3.2.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js +2 -2
  2. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js.map +1 -1
  3. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js +1 -27
  4. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js.map +1 -1
  5. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js +0 -1
  6. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js.map +1 -1
  7. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js +4 -6
  8. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js.map +1 -1
  9. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/index.vue.js +1 -27
  10. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/index.vue.js.map +1 -1
  11. package/dist/cjs/components/data-model/data-table/components/column-sort/column-sort.js +23 -5
  12. package/dist/cjs/components/data-model/data-table/components/column-sort/column-sort.js.map +1 -1
  13. package/dist/cjs/components/data-model/data-table/views/table/table.js +4 -16
  14. package/dist/cjs/components/data-model/data-table/views/table/table.js.map +1 -1
  15. package/dist/cjs/message-impl/DialogerImpl.js +1 -1
  16. package/dist/cjs/message-impl/DialogerImpl.js.map +1 -1
  17. package/dist/cjs/modules/ms/components/material-list/material-item.vue.js +34 -1
  18. package/dist/cjs/modules/ms/components/material-list/material-item.vue.js.map +1 -1
  19. package/dist/cjs/modules/ms/components/rich-text-editor/rich-text-editor.js.map +1 -1
  20. package/dist/cjs/modules/ms/dataviews/ms-config/MsConfigTable.js +9 -0
  21. package/dist/cjs/modules/ms/dataviews/ms-config/MsConfigTable.js.map +1 -1
  22. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js +2 -2
  23. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js.map +1 -1
  24. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js +3 -29
  25. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js.map +1 -1
  26. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js +0 -1
  27. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js.map +1 -1
  28. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js +5 -7
  29. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js.map +1 -1
  30. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/index.vue.js +2 -28
  31. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/index.vue.js.map +1 -1
  32. package/dist/esm/components/data-model/data-table/components/column-sort/column-sort.js +24 -6
  33. package/dist/esm/components/data-model/data-table/components/column-sort/column-sort.js.map +1 -1
  34. package/dist/esm/components/data-model/data-table/views/table/table.js +4 -16
  35. package/dist/esm/components/data-model/data-table/views/table/table.js.map +1 -1
  36. package/dist/esm/message-impl/DialogerImpl.js +1 -1
  37. package/dist/esm/message-impl/DialogerImpl.js.map +1 -1
  38. package/dist/esm/modules/ms/components/material-list/material-item.vue.js +34 -1
  39. package/dist/esm/modules/ms/components/material-list/material-item.vue.js.map +1 -1
  40. package/dist/esm/modules/ms/components/rich-text-editor/rich-text-editor.js.map +1 -1
  41. package/dist/esm/modules/ms/dataviews/ms-config/MsConfigTable.js +9 -0
  42. package/dist/esm/modules/ms/dataviews/ms-config/MsConfigTable.js.map +1 -1
  43. package/dist/types/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.d.ts +1 -1
  44. package/package.json +3 -3
  45. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js +0 -4
  46. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js.map +0 -1
  47. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js +0 -37
  48. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js.map +0 -1
  49. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js +0 -176
  50. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js.map +0 -1
  51. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js +0 -5
  52. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js.map +0 -1
  53. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js +0 -38
  54. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js.map +0 -1
  55. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js +0 -176
  56. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js.map +0 -1
@@ -1,176 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vue = require("vue");
4
- const invariant = require("tiny-invariant");
5
- const link = require("@lexical/link");
6
- const utils = require("@lexical/utils");
7
- const lexical = require("lexical");
8
- function findFirstMatch(text, matchers) {
9
- for (let i = 0; i < matchers.length; i++) {
10
- const match = matchers[i](text);
11
- if (match)
12
- return match;
13
- }
14
- return null;
15
- }
16
- const PUNCTUATION_OR_SPACE = /[.,;\s]/;
17
- function isSeparator(char) {
18
- return PUNCTUATION_OR_SPACE.test(char);
19
- }
20
- function endsWithSeparator(textContent) {
21
- return isSeparator(textContent[textContent.length - 1]);
22
- }
23
- function startsWithSeparator(textContent) {
24
- return isSeparator(textContent[0]);
25
- }
26
- function isPreviousNodeValid(node) {
27
- let previousNode = node.getPreviousSibling();
28
- if (lexical.$isElementNode(previousNode))
29
- previousNode = previousNode.getLastDescendant();
30
- return previousNode === null || lexical.$isLineBreakNode(previousNode) || lexical.$isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent());
31
- }
32
- function isNextNodeValid(node) {
33
- let nextNode = node.getNextSibling();
34
- if (lexical.$isElementNode(nextNode))
35
- nextNode = nextNode.getFirstDescendant();
36
- return nextNode === null || lexical.$isLineBreakNode(nextNode) || lexical.$isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent());
37
- }
38
- function isContentAroundIsValid(matchStart, matchEnd, text, node) {
39
- const contentBeforeIsValid = matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(node);
40
- if (!contentBeforeIsValid)
41
- return false;
42
- const contentAfterIsValid = matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(node);
43
- return contentAfterIsValid;
44
- }
45
- function handleLinkCreation(node, matchers, onChange) {
46
- const nodeText = node.getTextContent();
47
- let text = nodeText;
48
- let invalidMatchEnd = 0;
49
- let remainingTextNode = node;
50
- let match;
51
- while ((match = findFirstMatch(text, matchers)) && match !== null) {
52
- const matchStart = match.index;
53
- const matchLength = match.length;
54
- const matchEnd = matchStart + matchLength;
55
- const isValid = isContentAroundIsValid(
56
- invalidMatchEnd + matchStart,
57
- invalidMatchEnd + matchEnd,
58
- nodeText,
59
- node
60
- );
61
- if (isValid) {
62
- let linkTextNode;
63
- if (invalidMatchEnd + matchStart === 0) {
64
- [linkTextNode, remainingTextNode] = remainingTextNode.splitText(
65
- invalidMatchEnd + matchLength
66
- );
67
- } else {
68
- [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(
69
- invalidMatchEnd + matchStart,
70
- invalidMatchEnd + matchStart + matchLength
71
- );
72
- }
73
- const linkNode = link.$createAutoLinkNode(match.url, match.attributes);
74
- const textNode = lexical.$createTextNode(match.text);
75
- textNode.setFormat(linkTextNode.getFormat());
76
- textNode.setDetail(linkTextNode.getDetail());
77
- linkNode.append(textNode);
78
- linkTextNode.replace(linkNode);
79
- onChange(match.url, null);
80
- invalidMatchEnd = 0;
81
- } else {
82
- invalidMatchEnd += matchEnd;
83
- }
84
- text = text.substring(matchEnd);
85
- }
86
- }
87
- function handleLinkEdit(linkNode, matchers, onChange) {
88
- const children = linkNode.getChildren();
89
- const childrenLength = children.length;
90
- for (let i = 0; i < childrenLength; i++) {
91
- const child = children[i];
92
- if (!lexical.$isTextNode(child) || !child.isSimpleText()) {
93
- replaceWithChildren(linkNode);
94
- onChange(null, linkNode.getURL());
95
- return;
96
- }
97
- }
98
- const text = linkNode.getTextContent();
99
- const match = findFirstMatch(text, matchers);
100
- if (match === null || match.text !== text) {
101
- replaceWithChildren(linkNode);
102
- onChange(null, linkNode.getURL());
103
- return;
104
- }
105
- if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {
106
- replaceWithChildren(linkNode);
107
- onChange(null, linkNode.getURL());
108
- return;
109
- }
110
- const url = linkNode.getURL();
111
- if (url !== match.url) {
112
- linkNode.setURL(match.url);
113
- onChange(match.url, url);
114
- }
115
- if (match.attributes) {
116
- const rel = linkNode.getRel();
117
- if (rel !== match.attributes.rel) {
118
- linkNode.setRel(match.attributes.rel || null);
119
- onChange(match.attributes.rel || null, rel);
120
- }
121
- const target = linkNode.getTarget();
122
- if (target !== match.attributes.target) {
123
- linkNode.setTarget(match.attributes.target || null);
124
- onChange(match.attributes.target || null, target);
125
- }
126
- }
127
- }
128
- function handleBadNeighbors(textNode, onChange) {
129
- const previousSibling = textNode.getPreviousSibling();
130
- const nextSibling = textNode.getNextSibling();
131
- const text = textNode.getTextContent();
132
- if (link.$isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {
133
- replaceWithChildren(previousSibling);
134
- onChange(null, previousSibling.getURL());
135
- }
136
- if (link.$isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {
137
- replaceWithChildren(nextSibling);
138
- onChange(null, nextSibling.getURL());
139
- }
140
- }
141
- function replaceWithChildren(node) {
142
- const children = node.getChildren();
143
- const childrenLength = children.length;
144
- for (let j = childrenLength - 1; j >= 0; j--)
145
- node.insertAfter(children[j]);
146
- node.remove();
147
- return children.map((child) => child.getLatest());
148
- }
149
- function useAutoLink(editor, matchers, onChange) {
150
- vue.watchEffect((onInvalidate) => {
151
- if (!editor.hasNodes([link.AutoLinkNode]))
152
- invariant(false, "LexicalAutoLinkPlugin: AutoLinkNode not registered on editor");
153
- const onChangeWrapped = (url, prevUrl) => {
154
- if (onChange)
155
- onChange(url, prevUrl);
156
- };
157
- const fn = utils.mergeRegister(
158
- editor.registerNodeTransform(lexical.TextNode, (textNode) => {
159
- const parent = textNode.getParentOrThrow();
160
- if (link.$isAutoLinkNode(parent)) {
161
- handleLinkEdit(parent, vue.unref(matchers), onChangeWrapped);
162
- } else if (!link.$isLinkNode(parent)) {
163
- if (textNode.isSimpleText())
164
- handleLinkCreation(textNode, vue.unref(matchers), onChangeWrapped);
165
- handleBadNeighbors(textNode, onChangeWrapped);
166
- }
167
- }),
168
- editor.registerNodeTransform(link.AutoLinkNode, (linkNode) => {
169
- handleLinkEdit(linkNode, vue.unref(matchers), onChangeWrapped);
170
- })
171
- );
172
- onInvalidate(fn);
173
- });
174
- }
175
- exports.useAutoLink = useAutoLink;
176
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.ts"],"sourcesContent":["import type { LinkAttributes } from '@lexical/link'\r\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\r\nimport { unref, watchEffect } from 'vue'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport {\r\n $createAutoLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n AutoLinkNode,\r\n} from '@lexical/link'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport {\r\n $createTextNode,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isTextNode,\r\n TextNode,\r\n} from 'lexical'\r\nimport type { MaybeRef } from 'vue'\r\n\r\ntype ChangeHandler = (url: string | null, prevUrl: string | null) => void\r\n\r\ninterface LinkMatcherResult {\r\n attributes?: LinkAttributes\r\n index: number\r\n length: number\r\n text: string\r\n url: string\r\n}\r\n\r\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\r\n\r\nfunction findFirstMatch(\r\n text: string,\r\n matchers: Array<LinkMatcher>,\r\n): LinkMatcherResult | null {\r\n for (let i = 0; i < matchers.length; i++) {\r\n const match = matchers[i](text)\r\n\r\n if (match)\r\n return match\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\r\n\r\nfunction isSeparator(char: string): boolean {\r\n return PUNCTUATION_OR_SPACE.test(char)\r\n}\r\n\r\nfunction endsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[textContent.length - 1])\r\n}\r\n\r\nfunction startsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[0])\r\n}\r\n\r\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\r\n let previousNode = node.getPreviousSibling()\r\n if ($isElementNode(previousNode))\r\n previousNode = previousNode.getLastDescendant()\r\n\r\n return (\r\n previousNode === null\r\n || $isLineBreakNode(previousNode)\r\n || ($isTextNode(previousNode)\r\n && endsWithSeparator(previousNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isNextNodeValid(node: LexicalNode): boolean {\r\n let nextNode = node.getNextSibling()\r\n if ($isElementNode(nextNode))\r\n nextNode = nextNode.getFirstDescendant()\r\n\r\n return (\r\n nextNode === null\r\n || $isLineBreakNode(nextNode)\r\n || ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isContentAroundIsValid(\r\n matchStart: number,\r\n matchEnd: number,\r\n text: string,\r\n node: TextNode,\r\n): boolean {\r\n const contentBeforeIsValid\r\n = matchStart > 0\r\n ? isSeparator(text[matchStart - 1])\r\n : isPreviousNodeValid(node)\r\n if (!contentBeforeIsValid)\r\n return false\r\n\r\n const contentAfterIsValid\r\n = matchEnd < text.length\r\n ? isSeparator(text[matchEnd])\r\n : isNextNodeValid(node)\r\n return contentAfterIsValid\r\n}\r\n\r\nfunction handleLinkCreation(\r\n node: TextNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n const nodeText = node.getTextContent()\r\n let text = nodeText\r\n let invalidMatchEnd = 0\r\n let remainingTextNode = node\r\n let match\r\n\r\n // eslint-disable-next-line no-cond-assign\r\n while ((match = findFirstMatch(text, matchers)) && match !== null) {\r\n const matchStart = match.index\r\n const matchLength = match.length\r\n const matchEnd = matchStart + matchLength\r\n const isValid = isContentAroundIsValid(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchEnd,\r\n nodeText,\r\n node,\r\n )\r\n\r\n if (isValid) {\r\n let linkTextNode\r\n if (invalidMatchEnd + matchStart === 0) {\r\n [linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchLength,\r\n )\r\n }\r\n else {\r\n [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchStart + matchLength,\r\n )\r\n }\r\n const linkNode = $createAutoLinkNode(match.url, match.attributes)\r\n const textNode = $createTextNode(match.text)\r\n textNode.setFormat(linkTextNode.getFormat())\r\n textNode.setDetail(linkTextNode.getDetail())\r\n linkNode.append(textNode)\r\n linkTextNode.replace(linkNode)\r\n onChange(match.url, null)\r\n invalidMatchEnd = 0\r\n }\r\n else {\r\n invalidMatchEnd += matchEnd\r\n }\r\n\r\n text = text.substring(matchEnd)\r\n }\r\n}\r\n\r\nfunction handleLinkEdit(\r\n linkNode: AutoLinkNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n // Check children are simple text\r\n const children = linkNode.getChildren()\r\n const childrenLength = children.length\r\n for (let i = 0; i < childrenLength; i++) {\r\n const child = children[i]\r\n if (!$isTextNode(child) || !child.isSimpleText()) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n }\r\n\r\n // Check text content fully matches\r\n const text = linkNode.getTextContent()\r\n const match = findFirstMatch(text, matchers)\r\n if (match === null || match.text !== text) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n // Check neighbors\r\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n const url = linkNode.getURL()\r\n if (url !== match.url) {\r\n linkNode.setURL(match.url)\r\n onChange(match.url, url)\r\n }\r\n\r\n if (match.attributes) {\r\n const rel = linkNode.getRel()\r\n if (rel !== match.attributes.rel) {\r\n linkNode.setRel(match.attributes.rel || null)\r\n onChange(match.attributes.rel || null, rel)\r\n }\r\n\r\n const target = linkNode.getTarget()\r\n if (target !== match.attributes.target) {\r\n linkNode.setTarget(match.attributes.target || null)\r\n onChange(match.attributes.target || null, target)\r\n }\r\n }\r\n}\r\n\r\n// Bad neighbours are edits in neighbor nodes that make AutoLinks incompatible.\r\n// Given the creation preconditions, these can only be simple text nodes.\r\nfunction handleBadNeighbors(textNode: TextNode, onChange: ChangeHandler): void {\r\n const previousSibling = textNode.getPreviousSibling()\r\n const nextSibling = textNode.getNextSibling()\r\n const text = textNode.getTextContent()\r\n\r\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\r\n replaceWithChildren(previousSibling)\r\n onChange(null, previousSibling.getURL())\r\n }\r\n\r\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\r\n replaceWithChildren(nextSibling)\r\n onChange(null, nextSibling.getURL())\r\n }\r\n}\r\n\r\nfunction replaceWithChildren(node: ElementNode): Array<LexicalNode> {\r\n const children = node.getChildren()\r\n const childrenLength = children.length\r\n\r\n for (let j = childrenLength - 1; j >= 0; j--)\r\n node.insertAfter(children[j])\r\n\r\n node.remove()\r\n return children.map(child => child.getLatest())\r\n}\r\n\r\nexport function useAutoLink(\r\n editor: LexicalEditor,\r\n matchers: MaybeRef<Array<LinkMatcher>>,\r\n onChange?: ChangeHandler,\r\n) {\r\n watchEffect((onInvalidate) => {\r\n if (!editor.hasNodes([AutoLinkNode]))\r\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\r\n\r\n const onChangeWrapped = (url: string | null, prevUrl: string | null) => {\r\n if (onChange)\r\n onChange(url, prevUrl)\r\n }\r\n\r\n const fn = mergeRegister(\r\n editor.registerNodeTransform(TextNode, (textNode: TextNode) => {\r\n const parent = textNode.getParentOrThrow()\r\n if ($isAutoLinkNode(parent)) {\r\n handleLinkEdit(parent, unref(matchers), onChangeWrapped)\r\n }\r\n else if (!$isLinkNode(parent)) {\r\n if (textNode.isSimpleText())\r\n handleLinkCreation(textNode, unref(matchers), onChangeWrapped)\r\n\r\n handleBadNeighbors(textNode, onChangeWrapped)\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(AutoLinkNode, (linkNode: AutoLinkNode) => {\r\n handleLinkEdit(linkNode, unref(matchers), onChangeWrapped)\r\n }),\r\n )\r\n\r\n onInvalidate(fn)\r\n })\r\n}\r\n"],"names":["$isElementNode","$isLineBreakNode","$isTextNode","$createAutoLinkNode","$createTextNode","$isAutoLinkNode","watchEffect","AutoLinkNode","mergeRegister","TextNode","unref","$isLinkNode"],"mappings":";;;;;;;AAiCA,SAAS,eACP,MACA,UAC0B;AAC1B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC,EAAE,IAAI;AAE1B,QAAA;AACK,aAAA;AAAA,EACX;AAEO,SAAA;AACT;AAEA,MAAM,uBAAuB;AAE7B,SAAS,YAAY,MAAuB;AACnC,SAAA,qBAAqB,KAAK,IAAI;AACvC;AAEA,SAAS,kBAAkB,aAA8B;AACvD,SAAO,YAAY,YAAY,YAAY,SAAS,CAAC,CAAC;AACxD;AAEA,SAAS,oBAAoB,aAA8B;AAClD,SAAA,YAAY,YAAY,CAAC,CAAC;AACnC;AAEA,SAAS,oBAAoB,MAA4B;AACnD,MAAA,eAAe,KAAK;AACxB,MAAIA,QAAAA,eAAe,YAAY;AAC7B,mBAAe,aAAa;AAG5B,SAAA,iBAAiB,QACdC,QAAA,iBAAiB,YAAY,KAC5BC,QAAAA,YAAY,YAAY,KACzB,kBAAkB,aAAa,eAAgB,CAAA;AAEtD;AAEA,SAAS,gBAAgB,MAA4B;AAC/C,MAAA,WAAW,KAAK;AACpB,MAAIF,QAAAA,eAAe,QAAQ;AACzB,eAAW,SAAS;AAGpB,SAAA,aAAa,QACVC,QAAA,iBAAiB,QAAQ,KACxBC,QAAAA,YAAY,QAAQ,KAAK,oBAAoB,SAAS,eAAgB,CAAA;AAE9E;AAEA,SAAS,uBACP,YACA,UACA,MACA,MACS;AACH,QAAA,uBACF,aAAa,IACX,YAAY,KAAK,aAAa,CAAC,CAAC,IAChC,oBAAoB,IAAI;AAC9B,MAAI,CAAC;AACI,WAAA;AAEH,QAAA,sBACF,WAAW,KAAK,SACd,YAAY,KAAK,QAAQ,CAAC,IAC1B,gBAAgB,IAAI;AACnB,SAAA;AACT;AAEA,SAAS,mBACP,MACA,UACA,UACM;AACA,QAAA,WAAW,KAAK;AACtB,MAAI,OAAO;AACX,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACpB,MAAA;AAGJ,UAAQ,QAAQ,eAAe,MAAM,QAAQ,MAAM,UAAU,MAAM;AACjE,UAAM,aAAa,MAAM;AACzB,UAAM,cAAc,MAAM;AAC1B,UAAM,WAAW,aAAa;AAC9B,UAAM,UAAU;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,SAAS;AACP,UAAA;AACA,UAAA,kBAAkB,eAAe,GAAG;AACrC,SAAA,cAAc,iBAAiB,IAAI,kBAAkB;AAAA,UACpD,kBAAkB;AAAA,QAAA;AAAA,MACpB,OAEG;AACH,SAAA,EAAG,cAAc,iBAAiB,IAAI,kBAAkB;AAAA,UACtD,kBAAkB;AAAA,UAClB,kBAAkB,aAAa;AAAA,QAAA;AAAA,MAEnC;AACA,YAAM,WAAWC,KAAAA,oBAAoB,MAAM,KAAK,MAAM,UAAU;AAC1D,YAAA,WAAWC,QAAAA,gBAAgB,MAAM,IAAI;AAClC,eAAA,UAAU,aAAa,UAAW,CAAA;AAClC,eAAA,UAAU,aAAa,UAAW,CAAA;AAC3C,eAAS,OAAO,QAAQ;AACxB,mBAAa,QAAQ,QAAQ;AACpB,eAAA,MAAM,KAAK,IAAI;AACN,wBAAA;AAAA,IAAA,OAEf;AACgB,yBAAA;AAAA,IACrB;AAEO,WAAA,KAAK,UAAU,QAAQ;AAAA,EAChC;AACF;AAEA,SAAS,eACP,UACA,UACA,UACM;AAEA,QAAA,WAAW,SAAS;AAC1B,QAAM,iBAAiB,SAAS;AAChC,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACjC,UAAA,QAAQ,SAAS,CAAC;AACxB,QAAI,CAACF,QAAY,YAAA,KAAK,KAAK,CAAC,MAAM,gBAAgB;AAChD,0BAAoB,QAAQ;AACnB,eAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,IACF;AAAA,EACF;AAGM,QAAA,OAAO,SAAS;AAChB,QAAA,QAAQ,eAAe,MAAM,QAAQ;AAC3C,MAAI,UAAU,QAAQ,MAAM,SAAS,MAAM;AACzC,wBAAoB,QAAQ;AACnB,aAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,EACF;AAGA,MAAI,CAAC,oBAAoB,QAAQ,KAAK,CAAC,gBAAgB,QAAQ,GAAG;AAChE,wBAAoB,QAAQ;AACnB,aAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,EACF;AAEM,QAAA,MAAM,SAAS;AACjB,MAAA,QAAQ,MAAM,KAAK;AACZ,aAAA,OAAO,MAAM,GAAG;AAChB,aAAA,MAAM,KAAK,GAAG;AAAA,EACzB;AAEA,MAAI,MAAM,YAAY;AACd,UAAA,MAAM,SAAS;AACjB,QAAA,QAAQ,MAAM,WAAW,KAAK;AAChC,eAAS,OAAO,MAAM,WAAW,OAAO,IAAI;AAC5C,eAAS,MAAM,WAAW,OAAO,MAAM,GAAG;AAAA,IAC5C;AAEM,UAAA,SAAS,SAAS;AACpB,QAAA,WAAW,MAAM,WAAW,QAAQ;AACtC,eAAS,UAAU,MAAM,WAAW,UAAU,IAAI;AAClD,eAAS,MAAM,WAAW,UAAU,MAAM,MAAM;AAAA,IAClD;AAAA,EACF;AACF;AAIA,SAAS,mBAAmB,UAAoB,UAA+B;AACvE,QAAA,kBAAkB,SAAS;AAC3B,QAAA,cAAc,SAAS;AACvB,QAAA,OAAO,SAAS;AAEtB,MAAIG,qBAAgB,eAAe,KAAK,CAAC,oBAAoB,IAAI,GAAG;AAClE,wBAAoB,eAAe;AAC1B,aAAA,MAAM,gBAAgB,OAAQ,CAAA;AAAA,EACzC;AAEA,MAAIA,qBAAgB,WAAW,KAAK,CAAC,kBAAkB,IAAI,GAAG;AAC5D,wBAAoB,WAAW;AACtB,aAAA,MAAM,YAAY,OAAQ,CAAA;AAAA,EACrC;AACF;AAEA,SAAS,oBAAoB,MAAuC;AAC5D,QAAA,WAAW,KAAK;AACtB,QAAM,iBAAiB,SAAS;AAEhC,WAAS,IAAI,iBAAiB,GAAG,KAAK,GAAG;AAClC,SAAA,YAAY,SAAS,CAAC,CAAC;AAE9B,OAAK,OAAO;AACZ,SAAO,SAAS,IAAI,CAAS,UAAA,MAAM,WAAW;AAChD;AAEgB,SAAA,YACd,QACA,UACA,UACA;AACAC,MAAA,YAAY,CAAC,iBAAiB;AAC5B,QAAI,CAAC,OAAO,SAAS,CAACC,KAAY,YAAA,CAAC;AACjC,gBAAU,OAAO,8DAA8D;AAE3E,UAAA,kBAAkB,CAAC,KAAoB,YAA2B;AAClE,UAAA;AACF,iBAAS,KAAK,OAAO;AAAA,IAAA;AAGzB,UAAM,KAAKC,MAAA;AAAA,MACT,OAAO,sBAAsBC,kBAAU,CAAC,aAAuB;AACvD,cAAA,SAAS,SAAS;AACpB,YAAAJ,KAAAA,gBAAgB,MAAM,GAAG;AAC3B,yBAAe,QAAQK,IAAAA,MAAM,QAAQ,GAAG,eAAe;AAAA,QAAA,WAEhD,CAACC,iBAAY,MAAM,GAAG;AAC7B,cAAI,SAAS,aAAa;AACxB,+BAAmB,UAAUD,IAAAA,MAAM,QAAQ,GAAG,eAAe;AAE/D,6BAAmB,UAAU,eAAe;AAAA,QAC9C;AAAA,MAAA,CACD;AAAA,MAED,OAAO,sBAAsBH,mBAAc,CAAC,aAA2B;AACrE,uBAAe,UAAUG,IAAAA,MAAM,QAAQ,GAAG,eAAe;AAAA,MAAA,CAC1D;AAAA,IAAA;AAGH,iBAAa,EAAE;AAAA,EAAA,CAChB;AACH;;"}
@@ -1,5 +0,0 @@
1
- import _sfc_main from "./index.vue2.js";
2
- export {
3
- _sfc_main as default
4
- };
5
- //# sourceMappingURL=index.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,38 +0,0 @@
1
- import { defineComponent } from "vue";
2
- import "@lexical/text";
3
- import "@lexical/utils";
4
- import "@lexical/overflow";
5
- import "lexical";
6
- import "tiny-invariant";
7
- import "@lexical/history";
8
- import { useLexicalComposer } from "../../composables/useLexicalComposer.js";
9
- import "@lexical/list";
10
- import "@lexical/dragon";
11
- import "@lexical/plain-text";
12
- import "@lexical/rich-text";
13
- import { useAutoLink } from "./shared.js";
14
- const _sfc_main = /* @__PURE__ */ defineComponent({
15
- __name: "index",
16
- props: {
17
- matchers: {}
18
- },
19
- emits: ["change"],
20
- setup(__props, { emit: __emit }) {
21
- const props = __props;
22
- const emit = __emit;
23
- const editor = useLexicalComposer();
24
- useAutoLink(editor, props.matchers, (url, prevUrl) => {
25
- emit("change", {
26
- url,
27
- prevUrl
28
- });
29
- });
30
- return (_ctx, _cache) => {
31
- return null;
32
- };
33
- }
34
- });
35
- export {
36
- _sfc_main as default
37
- };
38
- //# sourceMappingURL=index.vue2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue2.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { useLexicalComposer } from '../../composables'\r\nimport { type LinkMatcher, useAutoLink } from './shared'\r\n\r\nconst props = defineProps<{\r\n matchers: LinkMatcher[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'change', value: { url: string | null, prevUrl: string | null }): void\r\n}>()\r\n\r\nconst editor = useLexicalComposer()\r\n\r\nuseAutoLink(editor, props.matchers, (url: string | null, prevUrl: string | null) => {\r\n emit('change', {\r\n url,\r\n prevUrl,\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAId,UAAM,OAAO;AAIb,UAAM,SAAS;AAEf,gBAAY,QAAQ,MAAM,UAAU,CAAC,KAAoB,YAA2B;AAClF,WAAK,UAAU;AAAA,QACb;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,CACF;;;;;;"}
@@ -1,176 +0,0 @@
1
- import { watchEffect, unref } from "vue";
2
- import invariant from "tiny-invariant";
3
- import { AutoLinkNode, $isAutoLinkNode, $isLinkNode, $createAutoLinkNode } from "@lexical/link";
4
- import { mergeRegister } from "@lexical/utils";
5
- import { TextNode, $createTextNode, $isTextNode, $isElementNode, $isLineBreakNode } from "lexical";
6
- function findFirstMatch(text, matchers) {
7
- for (let i = 0; i < matchers.length; i++) {
8
- const match = matchers[i](text);
9
- if (match)
10
- return match;
11
- }
12
- return null;
13
- }
14
- const PUNCTUATION_OR_SPACE = /[.,;\s]/;
15
- function isSeparator(char) {
16
- return PUNCTUATION_OR_SPACE.test(char);
17
- }
18
- function endsWithSeparator(textContent) {
19
- return isSeparator(textContent[textContent.length - 1]);
20
- }
21
- function startsWithSeparator(textContent) {
22
- return isSeparator(textContent[0]);
23
- }
24
- function isPreviousNodeValid(node) {
25
- let previousNode = node.getPreviousSibling();
26
- if ($isElementNode(previousNode))
27
- previousNode = previousNode.getLastDescendant();
28
- return previousNode === null || $isLineBreakNode(previousNode) || $isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent());
29
- }
30
- function isNextNodeValid(node) {
31
- let nextNode = node.getNextSibling();
32
- if ($isElementNode(nextNode))
33
- nextNode = nextNode.getFirstDescendant();
34
- return nextNode === null || $isLineBreakNode(nextNode) || $isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent());
35
- }
36
- function isContentAroundIsValid(matchStart, matchEnd, text, node) {
37
- const contentBeforeIsValid = matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(node);
38
- if (!contentBeforeIsValid)
39
- return false;
40
- const contentAfterIsValid = matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(node);
41
- return contentAfterIsValid;
42
- }
43
- function handleLinkCreation(node, matchers, onChange) {
44
- const nodeText = node.getTextContent();
45
- let text = nodeText;
46
- let invalidMatchEnd = 0;
47
- let remainingTextNode = node;
48
- let match;
49
- while ((match = findFirstMatch(text, matchers)) && match !== null) {
50
- const matchStart = match.index;
51
- const matchLength = match.length;
52
- const matchEnd = matchStart + matchLength;
53
- const isValid = isContentAroundIsValid(
54
- invalidMatchEnd + matchStart,
55
- invalidMatchEnd + matchEnd,
56
- nodeText,
57
- node
58
- );
59
- if (isValid) {
60
- let linkTextNode;
61
- if (invalidMatchEnd + matchStart === 0) {
62
- [linkTextNode, remainingTextNode] = remainingTextNode.splitText(
63
- invalidMatchEnd + matchLength
64
- );
65
- } else {
66
- [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(
67
- invalidMatchEnd + matchStart,
68
- invalidMatchEnd + matchStart + matchLength
69
- );
70
- }
71
- const linkNode = $createAutoLinkNode(match.url, match.attributes);
72
- const textNode = $createTextNode(match.text);
73
- textNode.setFormat(linkTextNode.getFormat());
74
- textNode.setDetail(linkTextNode.getDetail());
75
- linkNode.append(textNode);
76
- linkTextNode.replace(linkNode);
77
- onChange(match.url, null);
78
- invalidMatchEnd = 0;
79
- } else {
80
- invalidMatchEnd += matchEnd;
81
- }
82
- text = text.substring(matchEnd);
83
- }
84
- }
85
- function handleLinkEdit(linkNode, matchers, onChange) {
86
- const children = linkNode.getChildren();
87
- const childrenLength = children.length;
88
- for (let i = 0; i < childrenLength; i++) {
89
- const child = children[i];
90
- if (!$isTextNode(child) || !child.isSimpleText()) {
91
- replaceWithChildren(linkNode);
92
- onChange(null, linkNode.getURL());
93
- return;
94
- }
95
- }
96
- const text = linkNode.getTextContent();
97
- const match = findFirstMatch(text, matchers);
98
- if (match === null || match.text !== text) {
99
- replaceWithChildren(linkNode);
100
- onChange(null, linkNode.getURL());
101
- return;
102
- }
103
- if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {
104
- replaceWithChildren(linkNode);
105
- onChange(null, linkNode.getURL());
106
- return;
107
- }
108
- const url = linkNode.getURL();
109
- if (url !== match.url) {
110
- linkNode.setURL(match.url);
111
- onChange(match.url, url);
112
- }
113
- if (match.attributes) {
114
- const rel = linkNode.getRel();
115
- if (rel !== match.attributes.rel) {
116
- linkNode.setRel(match.attributes.rel || null);
117
- onChange(match.attributes.rel || null, rel);
118
- }
119
- const target = linkNode.getTarget();
120
- if (target !== match.attributes.target) {
121
- linkNode.setTarget(match.attributes.target || null);
122
- onChange(match.attributes.target || null, target);
123
- }
124
- }
125
- }
126
- function handleBadNeighbors(textNode, onChange) {
127
- const previousSibling = textNode.getPreviousSibling();
128
- const nextSibling = textNode.getNextSibling();
129
- const text = textNode.getTextContent();
130
- if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {
131
- replaceWithChildren(previousSibling);
132
- onChange(null, previousSibling.getURL());
133
- }
134
- if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {
135
- replaceWithChildren(nextSibling);
136
- onChange(null, nextSibling.getURL());
137
- }
138
- }
139
- function replaceWithChildren(node) {
140
- const children = node.getChildren();
141
- const childrenLength = children.length;
142
- for (let j = childrenLength - 1; j >= 0; j--)
143
- node.insertAfter(children[j]);
144
- node.remove();
145
- return children.map((child) => child.getLatest());
146
- }
147
- function useAutoLink(editor, matchers, onChange) {
148
- watchEffect((onInvalidate) => {
149
- if (!editor.hasNodes([AutoLinkNode]))
150
- invariant(false, "LexicalAutoLinkPlugin: AutoLinkNode not registered on editor");
151
- const onChangeWrapped = (url, prevUrl) => {
152
- if (onChange)
153
- onChange(url, prevUrl);
154
- };
155
- const fn = mergeRegister(
156
- editor.registerNodeTransform(TextNode, (textNode) => {
157
- const parent = textNode.getParentOrThrow();
158
- if ($isAutoLinkNode(parent)) {
159
- handleLinkEdit(parent, unref(matchers), onChangeWrapped);
160
- } else if (!$isLinkNode(parent)) {
161
- if (textNode.isSimpleText())
162
- handleLinkCreation(textNode, unref(matchers), onChangeWrapped);
163
- handleBadNeighbors(textNode, onChangeWrapped);
164
- }
165
- }),
166
- editor.registerNodeTransform(AutoLinkNode, (linkNode) => {
167
- handleLinkEdit(linkNode, unref(matchers), onChangeWrapped);
168
- })
169
- );
170
- onInvalidate(fn);
171
- });
172
- }
173
- export {
174
- useAutoLink
175
- };
176
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.ts"],"sourcesContent":["import type { LinkAttributes } from '@lexical/link'\r\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\r\nimport { unref, watchEffect } from 'vue'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport {\r\n $createAutoLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n AutoLinkNode,\r\n} from '@lexical/link'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport {\r\n $createTextNode,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isTextNode,\r\n TextNode,\r\n} from 'lexical'\r\nimport type { MaybeRef } from 'vue'\r\n\r\ntype ChangeHandler = (url: string | null, prevUrl: string | null) => void\r\n\r\ninterface LinkMatcherResult {\r\n attributes?: LinkAttributes\r\n index: number\r\n length: number\r\n text: string\r\n url: string\r\n}\r\n\r\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\r\n\r\nfunction findFirstMatch(\r\n text: string,\r\n matchers: Array<LinkMatcher>,\r\n): LinkMatcherResult | null {\r\n for (let i = 0; i < matchers.length; i++) {\r\n const match = matchers[i](text)\r\n\r\n if (match)\r\n return match\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\r\n\r\nfunction isSeparator(char: string): boolean {\r\n return PUNCTUATION_OR_SPACE.test(char)\r\n}\r\n\r\nfunction endsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[textContent.length - 1])\r\n}\r\n\r\nfunction startsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[0])\r\n}\r\n\r\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\r\n let previousNode = node.getPreviousSibling()\r\n if ($isElementNode(previousNode))\r\n previousNode = previousNode.getLastDescendant()\r\n\r\n return (\r\n previousNode === null\r\n || $isLineBreakNode(previousNode)\r\n || ($isTextNode(previousNode)\r\n && endsWithSeparator(previousNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isNextNodeValid(node: LexicalNode): boolean {\r\n let nextNode = node.getNextSibling()\r\n if ($isElementNode(nextNode))\r\n nextNode = nextNode.getFirstDescendant()\r\n\r\n return (\r\n nextNode === null\r\n || $isLineBreakNode(nextNode)\r\n || ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isContentAroundIsValid(\r\n matchStart: number,\r\n matchEnd: number,\r\n text: string,\r\n node: TextNode,\r\n): boolean {\r\n const contentBeforeIsValid\r\n = matchStart > 0\r\n ? isSeparator(text[matchStart - 1])\r\n : isPreviousNodeValid(node)\r\n if (!contentBeforeIsValid)\r\n return false\r\n\r\n const contentAfterIsValid\r\n = matchEnd < text.length\r\n ? isSeparator(text[matchEnd])\r\n : isNextNodeValid(node)\r\n return contentAfterIsValid\r\n}\r\n\r\nfunction handleLinkCreation(\r\n node: TextNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n const nodeText = node.getTextContent()\r\n let text = nodeText\r\n let invalidMatchEnd = 0\r\n let remainingTextNode = node\r\n let match\r\n\r\n // eslint-disable-next-line no-cond-assign\r\n while ((match = findFirstMatch(text, matchers)) && match !== null) {\r\n const matchStart = match.index\r\n const matchLength = match.length\r\n const matchEnd = matchStart + matchLength\r\n const isValid = isContentAroundIsValid(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchEnd,\r\n nodeText,\r\n node,\r\n )\r\n\r\n if (isValid) {\r\n let linkTextNode\r\n if (invalidMatchEnd + matchStart === 0) {\r\n [linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchLength,\r\n )\r\n }\r\n else {\r\n [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchStart + matchLength,\r\n )\r\n }\r\n const linkNode = $createAutoLinkNode(match.url, match.attributes)\r\n const textNode = $createTextNode(match.text)\r\n textNode.setFormat(linkTextNode.getFormat())\r\n textNode.setDetail(linkTextNode.getDetail())\r\n linkNode.append(textNode)\r\n linkTextNode.replace(linkNode)\r\n onChange(match.url, null)\r\n invalidMatchEnd = 0\r\n }\r\n else {\r\n invalidMatchEnd += matchEnd\r\n }\r\n\r\n text = text.substring(matchEnd)\r\n }\r\n}\r\n\r\nfunction handleLinkEdit(\r\n linkNode: AutoLinkNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n // Check children are simple text\r\n const children = linkNode.getChildren()\r\n const childrenLength = children.length\r\n for (let i = 0; i < childrenLength; i++) {\r\n const child = children[i]\r\n if (!$isTextNode(child) || !child.isSimpleText()) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n }\r\n\r\n // Check text content fully matches\r\n const text = linkNode.getTextContent()\r\n const match = findFirstMatch(text, matchers)\r\n if (match === null || match.text !== text) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n // Check neighbors\r\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n const url = linkNode.getURL()\r\n if (url !== match.url) {\r\n linkNode.setURL(match.url)\r\n onChange(match.url, url)\r\n }\r\n\r\n if (match.attributes) {\r\n const rel = linkNode.getRel()\r\n if (rel !== match.attributes.rel) {\r\n linkNode.setRel(match.attributes.rel || null)\r\n onChange(match.attributes.rel || null, rel)\r\n }\r\n\r\n const target = linkNode.getTarget()\r\n if (target !== match.attributes.target) {\r\n linkNode.setTarget(match.attributes.target || null)\r\n onChange(match.attributes.target || null, target)\r\n }\r\n }\r\n}\r\n\r\n// Bad neighbours are edits in neighbor nodes that make AutoLinks incompatible.\r\n// Given the creation preconditions, these can only be simple text nodes.\r\nfunction handleBadNeighbors(textNode: TextNode, onChange: ChangeHandler): void {\r\n const previousSibling = textNode.getPreviousSibling()\r\n const nextSibling = textNode.getNextSibling()\r\n const text = textNode.getTextContent()\r\n\r\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\r\n replaceWithChildren(previousSibling)\r\n onChange(null, previousSibling.getURL())\r\n }\r\n\r\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\r\n replaceWithChildren(nextSibling)\r\n onChange(null, nextSibling.getURL())\r\n }\r\n}\r\n\r\nfunction replaceWithChildren(node: ElementNode): Array<LexicalNode> {\r\n const children = node.getChildren()\r\n const childrenLength = children.length\r\n\r\n for (let j = childrenLength - 1; j >= 0; j--)\r\n node.insertAfter(children[j])\r\n\r\n node.remove()\r\n return children.map(child => child.getLatest())\r\n}\r\n\r\nexport function useAutoLink(\r\n editor: LexicalEditor,\r\n matchers: MaybeRef<Array<LinkMatcher>>,\r\n onChange?: ChangeHandler,\r\n) {\r\n watchEffect((onInvalidate) => {\r\n if (!editor.hasNodes([AutoLinkNode]))\r\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\r\n\r\n const onChangeWrapped = (url: string | null, prevUrl: string | null) => {\r\n if (onChange)\r\n onChange(url, prevUrl)\r\n }\r\n\r\n const fn = mergeRegister(\r\n editor.registerNodeTransform(TextNode, (textNode: TextNode) => {\r\n const parent = textNode.getParentOrThrow()\r\n if ($isAutoLinkNode(parent)) {\r\n handleLinkEdit(parent, unref(matchers), onChangeWrapped)\r\n }\r\n else if (!$isLinkNode(parent)) {\r\n if (textNode.isSimpleText())\r\n handleLinkCreation(textNode, unref(matchers), onChangeWrapped)\r\n\r\n handleBadNeighbors(textNode, onChangeWrapped)\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(AutoLinkNode, (linkNode: AutoLinkNode) => {\r\n handleLinkEdit(linkNode, unref(matchers), onChangeWrapped)\r\n }),\r\n )\r\n\r\n onInvalidate(fn)\r\n })\r\n}\r\n"],"names":[],"mappings":"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"}