@datalayer/jupyter-lexical 0.0.1

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 (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/lib/components/InsertEquationDialog.d.ts +6 -0
  4. package/lib/components/InsertEquationDialog.js +17 -0
  5. package/lib/components/InsertEquationDialog.js.map +1 -0
  6. package/lib/components/InsertImageDialog.d.ts +13 -0
  7. package/lib/components/InsertImageDialog.js +48 -0
  8. package/lib/components/InsertImageDialog.js.map +1 -0
  9. package/lib/components/JupyterCellComponent.d.ts +2 -0
  10. package/lib/components/JupyterCellComponent.js +12 -0
  11. package/lib/components/JupyterCellComponent.js.map +1 -0
  12. package/lib/components/JupyterOutputComponent.d.ts +13 -0
  13. package/lib/components/JupyterOutputComponent.js +8 -0
  14. package/lib/components/JupyterOutputComponent.js.map +1 -0
  15. package/lib/convert/LexicalToNbFormat.d.ts +4 -0
  16. package/lib/convert/LexicalToNbFormat.js +100 -0
  17. package/lib/convert/LexicalToNbFormat.js.map +1 -0
  18. package/lib/convert/NbFormatToLexical.d.ts +4 -0
  19. package/lib/convert/NbFormatToLexical.js +31 -0
  20. package/lib/convert/NbFormatToLexical.js.map +1 -0
  21. package/lib/convert/markdown/MarkdownExport.d.ts +11 -0
  22. package/lib/convert/markdown/MarkdownExport.js +129 -0
  23. package/lib/convert/markdown/MarkdownExport.js.map +1 -0
  24. package/lib/convert/markdown/MarkdownImport.d.ts +2 -0
  25. package/lib/convert/markdown/MarkdownImport.js +246 -0
  26. package/lib/convert/markdown/MarkdownImport.js.map +1 -0
  27. package/lib/convert/markdown/MarkdownShortcuts.d.ts +10 -0
  28. package/lib/convert/markdown/MarkdownShortcuts.js +254 -0
  29. package/lib/convert/markdown/MarkdownShortcuts.js.map +1 -0
  30. package/lib/convert/markdown/MarkdownTransformers.d.ts +39 -0
  31. package/lib/convert/markdown/MarkdownTransformers.js +242 -0
  32. package/lib/convert/markdown/MarkdownTransformers.js.map +1 -0
  33. package/lib/convert/markdown/convertToMarkdown.d.ts +1 -0
  34. package/lib/convert/markdown/convertToMarkdown.js +126 -0
  35. package/lib/convert/markdown/convertToMarkdown.js.map +1 -0
  36. package/lib/convert/markdown/index.d.ts +17 -0
  37. package/lib/convert/markdown/index.js +46 -0
  38. package/lib/convert/markdown/index.js.map +1 -0
  39. package/lib/convert/markdown/utils.d.ts +24 -0
  40. package/lib/convert/markdown/utils.js +303 -0
  41. package/lib/convert/markdown/utils.js.map +1 -0
  42. package/lib/convert/transformers/MarkdownTransformers.d.ts +13 -0
  43. package/lib/convert/transformers/MarkdownTransformers.js +178 -0
  44. package/lib/convert/transformers/MarkdownTransformers.js.map +1 -0
  45. package/lib/examples/App.d.ts +1 -0
  46. package/lib/examples/App.js +22 -0
  47. package/lib/examples/App.js.map +1 -0
  48. package/lib/examples/Editor.d.ts +9 -0
  49. package/lib/examples/Editor.js +81 -0
  50. package/lib/examples/Editor.js.map +1 -0
  51. package/lib/examples/Example.d.ts +1 -0
  52. package/lib/examples/Example.js +11 -0
  53. package/lib/examples/Example.js.map +1 -0
  54. package/lib/examples/content/Example.ipynb.json +98 -0
  55. package/lib/examples/content/Example.lexical.json +259 -0
  56. package/lib/examples/context/LexicalContext.d.ts +13 -0
  57. package/lib/examples/context/LexicalContext.js +22 -0
  58. package/lib/examples/context/LexicalContext.js.map +1 -0
  59. package/lib/examples/plugins/ToolbarPlugin.d.ts +2 -0
  60. package/lib/examples/plugins/ToolbarPlugin.js +448 -0
  61. package/lib/examples/plugins/ToolbarPlugin.js.map +1 -0
  62. package/lib/examples/plugins/TreeViewPlugin.d.ts +2 -0
  63. package/lib/examples/plugins/TreeViewPlugin.js +13 -0
  64. package/lib/examples/plugins/TreeViewPlugin.js.map +1 -0
  65. package/lib/examples/themes/Theme.d.ts +10 -0
  66. package/lib/examples/themes/Theme.js +94 -0
  67. package/lib/examples/themes/Theme.js.map +1 -0
  68. package/lib/hooks/useModal.d.ts +2 -0
  69. package/lib/hooks/useModal.js +39 -0
  70. package/lib/hooks/useModal.js.map +1 -0
  71. package/lib/images/yellow-flower-small.jpg +0 -0
  72. package/lib/index.d.ts +40 -0
  73. package/lib/index.js +55 -0
  74. package/lib/index.js.map +1 -0
  75. package/lib/jupyter/index.d.ts +0 -0
  76. package/lib/jupyter/index.js +6 -0
  77. package/lib/jupyter/index.js.map +1 -0
  78. package/lib/jupyter/lab/Example.d.ts +1 -0
  79. package/lib/jupyter/lab/Example.js +11 -0
  80. package/lib/jupyter/lab/Example.js.map +1 -0
  81. package/lib/jupyter/lab/__tests__/datalayer.spec.d.ts +0 -0
  82. package/lib/jupyter/lab/__tests__/datalayer.spec.js +11 -0
  83. package/lib/jupyter/lab/__tests__/datalayer.spec.js.map +1 -0
  84. package/lib/jupyter/lab/component/MockComponent.d.ts +2 -0
  85. package/lib/jupyter/lab/component/MockComponent.js +17 -0
  86. package/lib/jupyter/lab/component/MockComponent.js.map +1 -0
  87. package/lib/jupyter/lab/component/MockTab1.d.ts +2 -0
  88. package/lib/jupyter/lab/component/MockTab1.js +14 -0
  89. package/lib/jupyter/lab/component/MockTab1.js.map +1 -0
  90. package/lib/jupyter/lab/handler.d.ts +8 -0
  91. package/lib/jupyter/lab/handler.js +41 -0
  92. package/lib/jupyter/lab/handler.js.map +1 -0
  93. package/lib/jupyter/lab/index.d.ts +7 -0
  94. package/lib/jupyter/lab/index.js +73 -0
  95. package/lib/jupyter/lab/index.js.map +1 -0
  96. package/lib/jupyter/lab/widget.d.ts +6 -0
  97. package/lib/jupyter/lab/widget.js +18 -0
  98. package/lib/jupyter/lab/widget.js.map +1 -0
  99. package/lib/nodes/EquationNode.d.ts +31 -0
  100. package/lib/nodes/EquationNode.js +118 -0
  101. package/lib/nodes/EquationNode.js.map +1 -0
  102. package/lib/nodes/ImageNode.css +50 -0
  103. package/lib/nodes/ImageNode.d.ts +58 -0
  104. package/lib/nodes/ImageNode.js +275 -0
  105. package/lib/nodes/ImageNode.js.map +1 -0
  106. package/lib/nodes/JupyterCodeHighlightNode.d.ts +49 -0
  107. package/lib/nodes/JupyterCodeHighlightNode.js +165 -0
  108. package/lib/nodes/JupyterCodeHighlightNode.js.map +1 -0
  109. package/lib/nodes/JupyterCodeHighlighter.d.ts +28 -0
  110. package/lib/nodes/JupyterCodeHighlighter.js +522 -0
  111. package/lib/nodes/JupyterCodeHighlighter.js.map +1 -0
  112. package/lib/nodes/JupyterCodeNode.d.ts +50 -0
  113. package/lib/nodes/JupyterCodeNode.js +277 -0
  114. package/lib/nodes/JupyterCodeNode.js.map +1 -0
  115. package/lib/nodes/JupyterOutputNode.d.ts +58 -0
  116. package/lib/nodes/JupyterOutputNode.js +144 -0
  117. package/lib/nodes/JupyterOutputNode.js.map +1 -0
  118. package/lib/nodes/YouTubeNode.d.ts +28 -0
  119. package/lib/nodes/YouTubeNode.js +56 -0
  120. package/lib/nodes/YouTubeNode.js.map +1 -0
  121. package/lib/plugins/AutoEmbedPlugin.d.ts +17 -0
  122. package/lib/plugins/AutoEmbedPlugin.js +110 -0
  123. package/lib/plugins/AutoEmbedPlugin.js.map +1 -0
  124. package/lib/plugins/AutoLinkPlugin.d.ts +2 -0
  125. package/lib/plugins/AutoLinkPlugin.js +34 -0
  126. package/lib/plugins/AutoLinkPlugin.js.map +1 -0
  127. package/lib/plugins/CodeActionMenuPlugin.css +52 -0
  128. package/lib/plugins/CodeActionMenuPlugin.d.ts +12 -0
  129. package/lib/plugins/CodeActionMenuPlugin.js +108 -0
  130. package/lib/plugins/CodeActionMenuPlugin.js.map +1 -0
  131. package/lib/plugins/ComponentPickerMenuPlugin.d.ts +2 -0
  132. package/lib/plugins/ComponentPickerMenuPlugin.js +244 -0
  133. package/lib/plugins/ComponentPickerMenuPlugin.js.map +1 -0
  134. package/lib/plugins/EquationsPlugin.d.ts +21 -0
  135. package/lib/plugins/EquationsPlugin.js +48 -0
  136. package/lib/plugins/EquationsPlugin.js.map +1 -0
  137. package/lib/plugins/HorizontalRulePlugin.d.ts +2 -0
  138. package/lib/plugins/HorizontalRulePlugin.js +40 -0
  139. package/lib/plugins/HorizontalRulePlugin.js.map +1 -0
  140. package/lib/plugins/ImagesPlugin.d.ts +25 -0
  141. package/lib/plugins/ImagesPlugin.js +212 -0
  142. package/lib/plugins/ImagesPlugin.js.map +1 -0
  143. package/lib/plugins/JupyterPlugin.css +13 -0
  144. package/lib/plugins/JupyterPlugin.d.ts +16 -0
  145. package/lib/plugins/JupyterPlugin.js +169 -0
  146. package/lib/plugins/JupyterPlugin.js.map +1 -0
  147. package/lib/plugins/ListMaxIndentLevelPlugin.d.ts +4 -0
  148. package/lib/plugins/ListMaxIndentLevelPlugin.js +49 -0
  149. package/lib/plugins/ListMaxIndentLevelPlugin.js.map +1 -0
  150. package/lib/plugins/MardownPlugin.d.ts +2 -0
  151. package/lib/plugins/MardownPlugin.js +20 -0
  152. package/lib/plugins/MardownPlugin.js.map +1 -0
  153. package/lib/plugins/NbformatContentPlugin.d.ts +6 -0
  154. package/lib/plugins/NbformatContentPlugin.js +20 -0
  155. package/lib/plugins/NbformatContentPlugin.js.map +1 -0
  156. package/lib/plugins/TableOfContentsPlugin.css +87 -0
  157. package/lib/plugins/TableOfContentsPlugin.d.ts +3 -0
  158. package/lib/plugins/TableOfContentsPlugin.js +115 -0
  159. package/lib/plugins/TableOfContentsPlugin.js.map +1 -0
  160. package/lib/plugins/YouTubePlugin.d.ts +4 -0
  161. package/lib/plugins/YouTubePlugin.js +34 -0
  162. package/lib/plugins/YouTubePlugin.js.map +1 -0
  163. package/lib/ui/Button.css +40 -0
  164. package/lib/ui/Button.d.ts +18 -0
  165. package/lib/ui/Button.js +8 -0
  166. package/lib/ui/Button.js.map +1 -0
  167. package/lib/ui/ContentEditable.css +24 -0
  168. package/lib/ui/ContentEditable.d.ts +5 -0
  169. package/lib/ui/ContentEditable.js +20 -0
  170. package/lib/ui/ContentEditable.js.map +1 -0
  171. package/lib/ui/CopyButton.d.ts +7 -0
  172. package/lib/ui/CopyButton.js +47 -0
  173. package/lib/ui/CopyButton.js.map +1 -0
  174. package/lib/ui/Dialog.css +23 -0
  175. package/lib/ui/Dialog.d.ts +16 -0
  176. package/lib/ui/Dialog.js +21 -0
  177. package/lib/ui/Dialog.js.map +1 -0
  178. package/lib/ui/DropDown.d.ts +23 -0
  179. package/lib/ui/DropDown.js +119 -0
  180. package/lib/ui/DropDown.js.map +1 -0
  181. package/lib/ui/EquationEditor.css +42 -0
  182. package/lib/ui/EquationEditor.d.ts +18 -0
  183. package/lib/ui/EquationEditor.js +31 -0
  184. package/lib/ui/EquationEditor.js.map +1 -0
  185. package/lib/ui/FileInput.d.ts +15 -0
  186. package/lib/ui/FileInput.js +18 -0
  187. package/lib/ui/FileInput.js.map +1 -0
  188. package/lib/ui/ImageResizer.d.ts +16 -0
  189. package/lib/ui/ImageResizer.js +166 -0
  190. package/lib/ui/ImageResizer.js.map +1 -0
  191. package/lib/ui/Input.css +37 -0
  192. package/lib/ui/KatexEquationAlterer.css +45 -0
  193. package/lib/ui/KatexEquationAlterer.d.ts +7 -0
  194. package/lib/ui/KatexEquationAlterer.js +33 -0
  195. package/lib/ui/KatexEquationAlterer.js.map +1 -0
  196. package/lib/ui/KatexRenderer.d.ts +6 -0
  197. package/lib/ui/KatexRenderer.js +36 -0
  198. package/lib/ui/KatexRenderer.js.map +1 -0
  199. package/lib/ui/Modal.css +67 -0
  200. package/lib/ui/Modal.d.ts +15 -0
  201. package/lib/ui/Modal.js +58 -0
  202. package/lib/ui/Modal.js.map +1 -0
  203. package/lib/ui/Placeholder.css +29 -0
  204. package/lib/ui/Placeholder.d.ts +14 -0
  205. package/lib/ui/Placeholder.js +7 -0
  206. package/lib/ui/Placeholder.js.map +1 -0
  207. package/lib/ui/PrettierButton.css +20 -0
  208. package/lib/ui/PrettierButton.tsx_tmp +133 -0
  209. package/lib/ui/TextInput.d.ts +16 -0
  210. package/lib/ui/TextInput.js +20 -0
  211. package/lib/ui/TextInput.js.map +1 -0
  212. package/lib/utils/canUseDOM.d.ts +8 -0
  213. package/lib/utils/canUseDOM.js +16 -0
  214. package/lib/utils/canUseDOM.js.map +1 -0
  215. package/lib/utils/debouncer.d.ts +1 -0
  216. package/lib/utils/debouncer.js +24 -0
  217. package/lib/utils/debouncer.js.map +1 -0
  218. package/lib/utils/invariant.d.ts +8 -0
  219. package/lib/utils/invariant.js +23 -0
  220. package/lib/utils/invariant.js.map +1 -0
  221. package/lib/utils/join.d.ts +8 -0
  222. package/lib/utils/join.js +16 -0
  223. package/lib/utils/join.js.map +1 -0
  224. package/lib/utils/selection.d.ts +8 -0
  225. package/lib/utils/selection.js +14 -0
  226. package/lib/utils/selection.js.map +1 -0
  227. package/lib/utils/useLayoutEffect.d.ts +10 -0
  228. package/lib/utils/useLayoutEffect.js +19 -0
  229. package/lib/utils/useLayoutEffect.js.map +1 -0
  230. package/package.json +166 -0
  231. package/style/base.css +16 -0
  232. package/style/index.css +7 -0
  233. package/style/index.js +7 -0
@@ -0,0 +1,246 @@
1
+ /*
2
+ * Copyright (c) 2021-2023 Datalayer, Inc.
3
+ *
4
+ * MIT License
5
+ */
6
+ import { $createJupyterCodeNode } from './../../nodes/JupyterCodeNode';
7
+ import { $isListItemNode, $isListNode } from '@lexical/list';
8
+ import { $isQuoteNode } from '@lexical/rich-text';
9
+ import { $findMatchingParent } from '@lexical/utils';
10
+ import { $createLineBreakNode, $createParagraphNode, $createTextNode, $getRoot, $isParagraphNode, $isTextNode, } from 'lexical';
11
+ import { PUNCTUATION_OR_SPACE, transformersByType } from './utils';
12
+ const MARKDOWN_EMPTY_LINE_REG_EXP = /^\s{0,3}$/;
13
+ const CODE_BLOCK_REG_EXP = /^```(\w{1,10})?\s?$/;
14
+ export function createMarkdownImport(transformers) {
15
+ const byType = transformersByType(transformers);
16
+ const textFormatTransformersIndex = createTextFormatTransformersIndex(byType.textFormat);
17
+ return (markdownString) => {
18
+ const lines = markdownString.split('\n');
19
+ const linesLength = lines.length;
20
+ const root = $getRoot();
21
+ // root.clear();
22
+ for (let i = 0; i < linesLength; i++) {
23
+ const lineText = lines[i];
24
+ // Codeblocks are processed first as anything inside such block
25
+ // is ignored for further processing
26
+ // TODO:
27
+ // Abstract it to be dynamic as other transformers (add multiline match option)
28
+ const [codeBlockNode, shiftedIndex] = importCodeBlock(lines, i, root);
29
+ if (codeBlockNode != null) {
30
+ i = shiftedIndex;
31
+ continue;
32
+ }
33
+ importBlocks(lineText, root, byType.element, textFormatTransformersIndex, byType.textMatch);
34
+ }
35
+ // Removing empty paragraphs as md does not really
36
+ // allow empty lines and uses them as dilimiter
37
+ const children = root.getChildren();
38
+ for (const child of children) {
39
+ if (isEmptyParagraph(child)) {
40
+ child.remove();
41
+ }
42
+ }
43
+ root.selectEnd();
44
+ };
45
+ }
46
+ function isEmptyParagraph(node) {
47
+ if (!$isParagraphNode(node)) {
48
+ return false;
49
+ }
50
+ const firstChild = node.getFirstChild();
51
+ return (firstChild == null ||
52
+ (node.getChildrenSize() === 1 &&
53
+ $isTextNode(firstChild) &&
54
+ MARKDOWN_EMPTY_LINE_REG_EXP.test(firstChild.getTextContent())));
55
+ }
56
+ function importBlocks(lineText, rootNode, elementTransformers, textFormatTransformersIndex, textMatchTransformers) {
57
+ const lineTextTrimmed = lineText.trim();
58
+ const textNode = $createTextNode(lineTextTrimmed);
59
+ const elementNode = $createParagraphNode();
60
+ elementNode.append(textNode);
61
+ rootNode.append(elementNode);
62
+ for (const { regExp, replace } of elementTransformers) {
63
+ const match = lineText.match(regExp);
64
+ if (match) {
65
+ textNode.setTextContent(lineText.slice(match[0].length));
66
+ replace(elementNode, [textNode], match, true);
67
+ break;
68
+ }
69
+ }
70
+ importTextFormatTransformers(textNode, textFormatTransformersIndex, textMatchTransformers);
71
+ // If no transformer found and we left with original paragraph node
72
+ // can check if its content can be appended to the previous node
73
+ // if it's a paragraph, quote or list
74
+ if (elementNode.isAttached() && lineTextTrimmed.length > 0) {
75
+ const previousNode = elementNode.getPreviousSibling();
76
+ if ($isParagraphNode(previousNode) ||
77
+ $isQuoteNode(previousNode) ||
78
+ $isListNode(previousNode)) {
79
+ let targetNode = previousNode;
80
+ if ($isListNode(previousNode)) {
81
+ const lastDescendant = previousNode.getLastDescendant();
82
+ if (lastDescendant == null) {
83
+ targetNode = null;
84
+ }
85
+ else {
86
+ targetNode = $findMatchingParent(lastDescendant, $isListItemNode);
87
+ }
88
+ }
89
+ if (targetNode != null && targetNode.getTextContentSize() > 0) {
90
+ targetNode.splice(targetNode.getChildrenSize(), 0, [
91
+ $createLineBreakNode(),
92
+ ...elementNode.getChildren(),
93
+ ]);
94
+ elementNode.remove();
95
+ }
96
+ }
97
+ }
98
+ }
99
+ function importCodeBlock(lines, startLineIndex, rootNode) {
100
+ const openMatch = lines[startLineIndex].match(CODE_BLOCK_REG_EXP);
101
+ if (openMatch) {
102
+ let endLineIndex = startLineIndex;
103
+ const linesLength = lines.length;
104
+ while (++endLineIndex < linesLength) {
105
+ const closeMatch = lines[endLineIndex].match(CODE_BLOCK_REG_EXP);
106
+ if (closeMatch) {
107
+ const codeBlockNode = $createJupyterCodeNode(openMatch[1]);
108
+ const textNode = $createTextNode(lines.slice(startLineIndex + 1, endLineIndex).join('\n'));
109
+ codeBlockNode.append(textNode);
110
+ rootNode.append(codeBlockNode);
111
+ return [codeBlockNode, endLineIndex];
112
+ }
113
+ }
114
+ }
115
+ return [null, startLineIndex];
116
+ }
117
+ // Processing text content and replaces text format tags.
118
+ // It takes outermost tag match and its content, creates text node with
119
+ // format based on tag and then recursively executed over node's content
120
+ //
121
+ // E.g. for "*Hello **world**!*" string it will create text node with
122
+ // "Hello **world**!" content and italic format and run recursively over
123
+ // its content to transform "**world**" part
124
+ function importTextFormatTransformers(textNode, textFormatTransformersIndex, textMatchTransformers) {
125
+ const textContent = textNode.getTextContent();
126
+ const match = findOutermostMatch(textContent, textFormatTransformersIndex);
127
+ if (!match) {
128
+ // Once text format processing is done run text match transformers, as it
129
+ // only can span within single text node (unline formats that can cover multiple nodes)
130
+ importTextMatchTransformers(textNode, textMatchTransformers);
131
+ return;
132
+ }
133
+ let currentNode, remainderNode, leadingNode;
134
+ // If matching full content there's no need to run splitText and can reuse existing textNode
135
+ // to update its content and apply format. E.g. for **_Hello_** string after applying bold
136
+ // format (**) it will reuse the same text node to apply italic (_)
137
+ if (match[0] === textContent) {
138
+ currentNode = textNode;
139
+ }
140
+ else {
141
+ const startIndex = match.index || 0;
142
+ const endIndex = startIndex + match[0].length;
143
+ if (startIndex === 0) {
144
+ [currentNode, remainderNode] = textNode.splitText(endIndex);
145
+ }
146
+ else {
147
+ [leadingNode, currentNode, remainderNode] = textNode.splitText(startIndex, endIndex);
148
+ }
149
+ }
150
+ currentNode.setTextContent(match[2]);
151
+ const transformer = textFormatTransformersIndex.transformersByTag[match[1]];
152
+ if (transformer) {
153
+ for (const format of transformer.format) {
154
+ if (!currentNode.hasFormat(format)) {
155
+ currentNode.toggleFormat(format);
156
+ }
157
+ }
158
+ }
159
+ // Recursively run over inner text if it's not inline code
160
+ if (!currentNode.hasFormat('code')) {
161
+ importTextFormatTransformers(currentNode, textFormatTransformersIndex, textMatchTransformers);
162
+ }
163
+ // Run over leading/remaining text if any
164
+ if (leadingNode) {
165
+ importTextFormatTransformers(leadingNode, textFormatTransformersIndex, textMatchTransformers);
166
+ }
167
+ if (remainderNode) {
168
+ importTextFormatTransformers(remainderNode, textFormatTransformersIndex, textMatchTransformers);
169
+ }
170
+ }
171
+ function importTextMatchTransformers(textNode_, textMatchTransformers) {
172
+ let textNode = textNode_;
173
+ mainLoop: while (textNode) {
174
+ for (const transformer of textMatchTransformers) {
175
+ const match = textNode.getTextContent().match(transformer.importRegExp);
176
+ if (!match) {
177
+ continue;
178
+ }
179
+ const startIndex = match.index || 0;
180
+ const endIndex = startIndex + match[0].length;
181
+ let replaceNode;
182
+ if (startIndex === 0) {
183
+ [replaceNode, textNode] = textNode.splitText(endIndex);
184
+ }
185
+ else {
186
+ [, replaceNode, textNode] = textNode.splitText(startIndex, endIndex);
187
+ }
188
+ transformer.replace(replaceNode, match);
189
+ continue mainLoop;
190
+ }
191
+ break;
192
+ }
193
+ }
194
+ // Finds first "<tag>content<tag>" match that is not nested into another tag
195
+ function findOutermostMatch(textContent, textTransformersIndex) {
196
+ const openTagsMatch = textContent.match(textTransformersIndex.openTagsRegExp);
197
+ if (openTagsMatch == null) {
198
+ return null;
199
+ }
200
+ for (const match of openTagsMatch) {
201
+ // Open tags reg exp might capture leading space so removing it
202
+ // before using match to find transformer
203
+ const tag = match.replace(/^\s/, '');
204
+ const fullMatchRegExp = textTransformersIndex.fullMatchRegExpByTag[tag];
205
+ if (fullMatchRegExp == null) {
206
+ continue;
207
+ }
208
+ const fullMatch = textContent.match(fullMatchRegExp);
209
+ const transformer = textTransformersIndex.transformersByTag[tag];
210
+ if (fullMatch != null && transformer != null) {
211
+ if (transformer.intraword !== false) {
212
+ return fullMatch;
213
+ }
214
+ // For non-intraword transformers checking if it's within a word
215
+ // or surrounded with space/punctuation/newline
216
+ const { index = 0 } = fullMatch;
217
+ const beforeChar = textContent[index - 1];
218
+ const afterChar = textContent[index + fullMatch[0].length];
219
+ if ((!beforeChar || PUNCTUATION_OR_SPACE.test(beforeChar)) &&
220
+ (!afterChar || PUNCTUATION_OR_SPACE.test(afterChar))) {
221
+ return fullMatch;
222
+ }
223
+ }
224
+ }
225
+ return null;
226
+ }
227
+ function createTextFormatTransformersIndex(textTransformers) {
228
+ const transformersByTag = {};
229
+ const fullMatchRegExpByTag = {};
230
+ const openTagsRegExp = [];
231
+ for (const transformer of textTransformers) {
232
+ const { tag } = transformer;
233
+ transformersByTag[tag] = transformer;
234
+ const tagRegExp = tag.replace(/(\*|\^)/g, '\\$1');
235
+ openTagsRegExp.push(tagRegExp);
236
+ fullMatchRegExpByTag[tag] = new RegExp(`(${tagRegExp})(?![${tagRegExp}\\s])(.*?[^${tagRegExp}\\s])${tagRegExp}(?!${tagRegExp})`);
237
+ }
238
+ return {
239
+ // Reg exp to find open tag + content + close tag
240
+ fullMatchRegExpByTag,
241
+ // Reg exp to find opening tags
242
+ openTagsRegExp: new RegExp('(' + openTagsRegExp.join('|') + ')', 'g'),
243
+ transformersByTag,
244
+ };
245
+ }
246
+ //# sourceMappingURL=MarkdownImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownImport.js","sourceRoot":"","sources":["../../../src/convert/markdown/MarkdownImport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ import type { Transformer } from '.';
9
+ import type { LexicalEditor } from 'lexical';
10
+ export declare function registerMarkdownShortcuts(editor: LexicalEditor, transformers?: Array<Transformer>): () => void;
@@ -0,0 +1,254 @@
1
+ /*
2
+ * Copyright (c) 2021-2023 Datalayer, Inc.
3
+ *
4
+ * MIT License
5
+ */
6
+ import { $isJupyterCodeNode } from './../../nodes/JupyterCodeNode';
7
+ import { $createRangeSelection, $getSelection, $isLineBreakNode, $isRangeSelection, $isRootNode, $isTextNode, $setSelection, } from 'lexical';
8
+ import invariant from '../../utils/invariant';
9
+ import { TRANSFORMERS } from '.';
10
+ import { indexBy, PUNCTUATION_OR_SPACE, transformersByType } from './utils';
11
+ function runElementTransformers(parentNode, anchorNode, anchorOffset, elementTransformers) {
12
+ const grandParentNode = parentNode.getParent();
13
+ if (!$isRootNode(grandParentNode) ||
14
+ parentNode.getFirstChild() !== anchorNode) {
15
+ return false;
16
+ }
17
+ const textContent = anchorNode.getTextContent();
18
+ // Checking for anchorOffset position to prevent any checks for cases when caret is too far
19
+ // from a line start to be a part of block-level markdown trigger.
20
+ //
21
+ // TODO:
22
+ // Can have a quick check if caret is close enough to the beginning of the string (e.g. offset less than 10-20)
23
+ // since otherwise it won't be a markdown shortcut, but tables are exception
24
+ if (textContent[anchorOffset - 1] !== ' ') {
25
+ return false;
26
+ }
27
+ for (const { regExp, replace } of elementTransformers) {
28
+ const match = textContent.match(regExp);
29
+ if (match && match[0].length === anchorOffset) {
30
+ const nextSiblings = anchorNode.getNextSiblings();
31
+ const [leadingNode, remainderNode] = anchorNode.splitText(anchorOffset);
32
+ leadingNode.remove();
33
+ const siblings = remainderNode
34
+ ? [remainderNode, ...nextSiblings]
35
+ : nextSiblings;
36
+ replace(parentNode, siblings, match, false);
37
+ return true;
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ function runTextMatchTransformers(anchorNode, anchorOffset, transformersByTrigger) {
43
+ let textContent = anchorNode.getTextContent();
44
+ const lastChar = textContent[anchorOffset - 1];
45
+ const transformers = transformersByTrigger[lastChar];
46
+ if (transformers == null) {
47
+ return false;
48
+ }
49
+ // If typing in the middle of content, remove the tail to do
50
+ // reg exp match up to a string end (caret position)
51
+ if (anchorOffset < textContent.length) {
52
+ textContent = textContent.slice(0, anchorOffset);
53
+ }
54
+ for (const transformer of transformers) {
55
+ const match = textContent.match(transformer.regExp);
56
+ if (match === null) {
57
+ continue;
58
+ }
59
+ const startIndex = match.index || 0;
60
+ const endIndex = startIndex + match[0].length;
61
+ let replaceNode;
62
+ if (startIndex === 0) {
63
+ [replaceNode] = anchorNode.splitText(endIndex);
64
+ }
65
+ else {
66
+ [, replaceNode] = anchorNode.splitText(startIndex, endIndex);
67
+ }
68
+ replaceNode.selectNext(0, 0);
69
+ transformer.replace(replaceNode, match);
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ function runTextFormatTransformers(anchorNode, anchorOffset, textFormatTransformers) {
75
+ const textContent = anchorNode.getTextContent();
76
+ const closeTagEndIndex = anchorOffset - 1;
77
+ const closeChar = textContent[closeTagEndIndex];
78
+ // Quick check if we're possibly at the end of inline markdown style
79
+ const matchers = textFormatTransformers[closeChar];
80
+ if (!matchers) {
81
+ return false;
82
+ }
83
+ for (const matcher of matchers) {
84
+ const { tag } = matcher;
85
+ const tagLength = tag.length;
86
+ const closeTagStartIndex = closeTagEndIndex - tagLength + 1;
87
+ // If tag is not single char check if rest of it matches with text content
88
+ if (tagLength > 1) {
89
+ if (!isEqualSubString(textContent, closeTagStartIndex, tag, 0, tagLength)) {
90
+ continue;
91
+ }
92
+ }
93
+ // Space before closing tag cancels inline markdown
94
+ if (textContent[closeTagStartIndex - 1] === ' ') {
95
+ continue;
96
+ }
97
+ // Some tags can not be used within words, hence should have newline/space/punctuation after it
98
+ const afterCloseTagChar = textContent[closeTagEndIndex + 1];
99
+ if (matcher.intraword === false &&
100
+ afterCloseTagChar &&
101
+ !PUNCTUATION_OR_SPACE.test(afterCloseTagChar)) {
102
+ continue;
103
+ }
104
+ const closeNode = anchorNode;
105
+ let openNode = closeNode;
106
+ let openTagStartIndex = getOpenTagStartIndex(textContent, closeTagStartIndex, tag);
107
+ // Go through text node siblings and search for opening tag
108
+ // if haven't found it within the same text node as closing tag
109
+ let sibling = openNode;
110
+ while (openTagStartIndex < 0 &&
111
+ (sibling = sibling.getPreviousSibling())) {
112
+ if ($isLineBreakNode(sibling)) {
113
+ break;
114
+ }
115
+ if ($isTextNode(sibling)) {
116
+ const siblingTextContent = sibling.getTextContent();
117
+ openNode = sibling;
118
+ openTagStartIndex = getOpenTagStartIndex(siblingTextContent, siblingTextContent.length, tag);
119
+ }
120
+ }
121
+ // Opening tag is not found
122
+ if (openTagStartIndex < 0) {
123
+ continue;
124
+ }
125
+ // No content between opening and closing tag
126
+ if (openNode === closeNode &&
127
+ openTagStartIndex + tagLength === closeTagStartIndex) {
128
+ continue;
129
+ }
130
+ // Checking longer tags for repeating chars (e.g. *** vs **)
131
+ const prevOpenNodeText = openNode.getTextContent();
132
+ if (openTagStartIndex > 0 &&
133
+ prevOpenNodeText[openTagStartIndex - 1] === closeChar) {
134
+ continue;
135
+ }
136
+ // Some tags can not be used within words, hence should have newline/space/punctuation before it
137
+ const beforeOpenTagChar = prevOpenNodeText[openTagStartIndex - 1];
138
+ if (matcher.intraword === false &&
139
+ beforeOpenTagChar &&
140
+ !PUNCTUATION_OR_SPACE.test(beforeOpenTagChar)) {
141
+ continue;
142
+ }
143
+ // Clean text from opening and closing tags (starting from closing tag
144
+ // to prevent any offset shifts if we start from opening one)
145
+ const prevCloseNodeText = closeNode.getTextContent();
146
+ const closeNodeText = prevCloseNodeText.slice(0, closeTagStartIndex) +
147
+ prevCloseNodeText.slice(closeTagEndIndex + 1);
148
+ closeNode.setTextContent(closeNodeText);
149
+ const openNodeText = openNode === closeNode ? closeNodeText : prevOpenNodeText;
150
+ openNode.setTextContent(openNodeText.slice(0, openTagStartIndex) +
151
+ openNodeText.slice(openTagStartIndex + tagLength));
152
+ const selection = $getSelection();
153
+ const nextSelection = $createRangeSelection();
154
+ $setSelection(nextSelection);
155
+ // Adjust offset based on deleted chars
156
+ const newOffset = closeTagEndIndex - tagLength * (openNode === closeNode ? 2 : 1) + 1;
157
+ nextSelection.anchor.set(openNode.__key, openTagStartIndex, 'text');
158
+ nextSelection.focus.set(closeNode.__key, newOffset, 'text');
159
+ // Apply formatting to selected text
160
+ for (const format of matcher.format) {
161
+ if (!nextSelection.hasFormat(format)) {
162
+ nextSelection.formatText(format);
163
+ }
164
+ }
165
+ // Collapse selection up to the focus point
166
+ nextSelection.anchor.set(nextSelection.focus.key, nextSelection.focus.offset, nextSelection.focus.type);
167
+ // Remove formatting from collapsed selection
168
+ for (const format of matcher.format) {
169
+ if (nextSelection.hasFormat(format)) {
170
+ nextSelection.toggleFormat(format);
171
+ }
172
+ }
173
+ if ($isRangeSelection(selection)) {
174
+ nextSelection.format = selection.format;
175
+ }
176
+ return true;
177
+ }
178
+ return false;
179
+ }
180
+ function getOpenTagStartIndex(string, maxIndex, tag) {
181
+ const tagLength = tag.length;
182
+ for (let i = maxIndex; i >= tagLength; i--) {
183
+ const startIndex = i - tagLength;
184
+ if (isEqualSubString(string, startIndex, tag, 0, tagLength) && // Space after opening tag cancels transformation
185
+ string[startIndex + tagLength] !== ' ') {
186
+ return startIndex;
187
+ }
188
+ }
189
+ return -1;
190
+ }
191
+ function isEqualSubString(stringA, aStart, stringB, bStart, length) {
192
+ for (let i = 0; i < length; i++) {
193
+ if (stringA[aStart + i] !== stringB[bStart + i]) {
194
+ return false;
195
+ }
196
+ }
197
+ return true;
198
+ }
199
+ export function registerMarkdownShortcuts(editor, transformers = TRANSFORMERS) {
200
+ const byType = transformersByType(transformers);
201
+ const textFormatTransformersIndex = indexBy(byType.textFormat, ({ tag }) => tag[tag.length - 1]);
202
+ const textMatchTransformersIndex = indexBy(byType.textMatch, ({ trigger }) => trigger);
203
+ for (const transformer of transformers) {
204
+ const type = transformer.type;
205
+ if (type === 'element' || type === 'text-match') {
206
+ const dependencies = transformer.dependencies;
207
+ if (!editor.hasNodes(dependencies)) {
208
+ invariant(false, 'MarkdownShortcuts: missing dependency for transformer. Ensure node dependency is included in editor initial config.');
209
+ }
210
+ }
211
+ }
212
+ const transform = (parentNode, anchorNode, anchorOffset) => {
213
+ if (runElementTransformers(parentNode, anchorNode, anchorOffset, byType.element)) {
214
+ return;
215
+ }
216
+ if (runTextMatchTransformers(anchorNode, anchorOffset, textMatchTransformersIndex)) {
217
+ return;
218
+ }
219
+ runTextFormatTransformers(anchorNode, anchorOffset, textFormatTransformersIndex);
220
+ };
221
+ return editor.registerUpdateListener(({ tags, dirtyLeaves, editorState, prevEditorState }) => {
222
+ // Ignore updates from undo/redo (as changes already calculated)
223
+ if (tags.has('historic')) {
224
+ return;
225
+ }
226
+ const selection = editorState.read($getSelection);
227
+ const prevSelection = prevEditorState.read($getSelection);
228
+ if (!$isRangeSelection(prevSelection) ||
229
+ !$isRangeSelection(selection) ||
230
+ !selection.isCollapsed()) {
231
+ return;
232
+ }
233
+ const anchorKey = selection.anchor.key;
234
+ const anchorOffset = selection.anchor.offset;
235
+ const anchorNode = editorState._nodeMap.get(anchorKey);
236
+ if (!$isTextNode(anchorNode) ||
237
+ !dirtyLeaves.has(anchorKey) ||
238
+ (anchorOffset !== 1 && anchorOffset !== prevSelection.anchor.offset + 1)) {
239
+ return;
240
+ }
241
+ editor.update(() => {
242
+ // Markdown is not available inside code
243
+ if (anchorNode.hasFormat('code')) {
244
+ return;
245
+ }
246
+ const parentNode = anchorNode.getParent();
247
+ if (parentNode === null || $isJupyterCodeNode(parentNode)) {
248
+ return;
249
+ }
250
+ transform(parentNode, anchorNode, selection.anchor.offset);
251
+ });
252
+ });
253
+ }
254
+ //# sourceMappingURL=MarkdownShortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownShortcuts.js","sourceRoot":"","sources":["../../../src/convert/markdown/MarkdownShortcuts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ElementNode, Klass, LexicalNode, TextFormatType, TextNode } from 'lexical';
2
+ export type Transformer = ElementTransformer | TextFormatTransformer | TextMatchTransformer;
3
+ export type ElementTransformer = {
4
+ dependencies: Array<Klass<LexicalNode>>;
5
+ export: (node: LexicalNode, traverseChildren: (node: ElementNode) => string) => string | null;
6
+ regExp: RegExp;
7
+ replace: (parentNode: ElementNode, children: Array<LexicalNode>, match: Array<string>, isImport: boolean) => void;
8
+ type: 'element';
9
+ };
10
+ export type TextFormatTransformer = Readonly<{
11
+ format: ReadonlyArray<TextFormatType>;
12
+ tag: string;
13
+ intraword?: boolean;
14
+ type: 'text-format';
15
+ }>;
16
+ export type TextMatchTransformer = Readonly<{
17
+ dependencies: Array<Klass<LexicalNode>>;
18
+ export: (node: LexicalNode, exportChildren: (node: ElementNode) => string, exportFormat: (node: TextNode, textContent: string) => string) => string | null;
19
+ importRegExp: RegExp;
20
+ regExp: RegExp;
21
+ replace: (node: TextNode, match: RegExpMatchArray) => void;
22
+ trigger: string;
23
+ type: 'text-match';
24
+ }>;
25
+ export declare const HEADING: ElementTransformer;
26
+ export declare const QUOTE: ElementTransformer;
27
+ export declare const CODE: ElementTransformer;
28
+ export declare const UNORDERED_LIST: ElementTransformer;
29
+ export declare const CHECK_LIST: ElementTransformer;
30
+ export declare const ORDERED_LIST: ElementTransformer;
31
+ export declare const INLINE_CODE: TextFormatTransformer;
32
+ export declare const BOLD_ITALIC_STAR: TextFormatTransformer;
33
+ export declare const BOLD_ITALIC_UNDERSCORE: TextFormatTransformer;
34
+ export declare const BOLD_STAR: TextFormatTransformer;
35
+ export declare const BOLD_UNDERSCORE: TextFormatTransformer;
36
+ export declare const STRIKETHROUGH: TextFormatTransformer;
37
+ export declare const ITALIC_STAR: TextFormatTransformer;
38
+ export declare const ITALIC_UNDERSCORE: TextFormatTransformer;
39
+ export declare const LINK: TextMatchTransformer;