@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.
- package/LICENSE +21 -0
- package/README.md +7 -0
- package/lib/components/InsertEquationDialog.d.ts +6 -0
- package/lib/components/InsertEquationDialog.js +17 -0
- package/lib/components/InsertEquationDialog.js.map +1 -0
- package/lib/components/InsertImageDialog.d.ts +13 -0
- package/lib/components/InsertImageDialog.js +48 -0
- package/lib/components/InsertImageDialog.js.map +1 -0
- package/lib/components/JupyterCellComponent.d.ts +2 -0
- package/lib/components/JupyterCellComponent.js +12 -0
- package/lib/components/JupyterCellComponent.js.map +1 -0
- package/lib/components/JupyterOutputComponent.d.ts +13 -0
- package/lib/components/JupyterOutputComponent.js +8 -0
- package/lib/components/JupyterOutputComponent.js.map +1 -0
- package/lib/convert/LexicalToNbFormat.d.ts +4 -0
- package/lib/convert/LexicalToNbFormat.js +100 -0
- package/lib/convert/LexicalToNbFormat.js.map +1 -0
- package/lib/convert/NbFormatToLexical.d.ts +4 -0
- package/lib/convert/NbFormatToLexical.js +31 -0
- package/lib/convert/NbFormatToLexical.js.map +1 -0
- package/lib/convert/markdown/MarkdownExport.d.ts +11 -0
- package/lib/convert/markdown/MarkdownExport.js +129 -0
- package/lib/convert/markdown/MarkdownExport.js.map +1 -0
- package/lib/convert/markdown/MarkdownImport.d.ts +2 -0
- package/lib/convert/markdown/MarkdownImport.js +246 -0
- package/lib/convert/markdown/MarkdownImport.js.map +1 -0
- package/lib/convert/markdown/MarkdownShortcuts.d.ts +10 -0
- package/lib/convert/markdown/MarkdownShortcuts.js +254 -0
- package/lib/convert/markdown/MarkdownShortcuts.js.map +1 -0
- package/lib/convert/markdown/MarkdownTransformers.d.ts +39 -0
- package/lib/convert/markdown/MarkdownTransformers.js +242 -0
- package/lib/convert/markdown/MarkdownTransformers.js.map +1 -0
- package/lib/convert/markdown/convertToMarkdown.d.ts +1 -0
- package/lib/convert/markdown/convertToMarkdown.js +126 -0
- package/lib/convert/markdown/convertToMarkdown.js.map +1 -0
- package/lib/convert/markdown/index.d.ts +17 -0
- package/lib/convert/markdown/index.js +46 -0
- package/lib/convert/markdown/index.js.map +1 -0
- package/lib/convert/markdown/utils.d.ts +24 -0
- package/lib/convert/markdown/utils.js +303 -0
- package/lib/convert/markdown/utils.js.map +1 -0
- package/lib/convert/transformers/MarkdownTransformers.d.ts +13 -0
- package/lib/convert/transformers/MarkdownTransformers.js +178 -0
- package/lib/convert/transformers/MarkdownTransformers.js.map +1 -0
- package/lib/examples/App.d.ts +1 -0
- package/lib/examples/App.js +22 -0
- package/lib/examples/App.js.map +1 -0
- package/lib/examples/Editor.d.ts +9 -0
- package/lib/examples/Editor.js +81 -0
- package/lib/examples/Editor.js.map +1 -0
- package/lib/examples/Example.d.ts +1 -0
- package/lib/examples/Example.js +11 -0
- package/lib/examples/Example.js.map +1 -0
- package/lib/examples/content/Example.ipynb.json +98 -0
- package/lib/examples/content/Example.lexical.json +259 -0
- package/lib/examples/context/LexicalContext.d.ts +13 -0
- package/lib/examples/context/LexicalContext.js +22 -0
- package/lib/examples/context/LexicalContext.js.map +1 -0
- package/lib/examples/plugins/ToolbarPlugin.d.ts +2 -0
- package/lib/examples/plugins/ToolbarPlugin.js +448 -0
- package/lib/examples/plugins/ToolbarPlugin.js.map +1 -0
- package/lib/examples/plugins/TreeViewPlugin.d.ts +2 -0
- package/lib/examples/plugins/TreeViewPlugin.js +13 -0
- package/lib/examples/plugins/TreeViewPlugin.js.map +1 -0
- package/lib/examples/themes/Theme.d.ts +10 -0
- package/lib/examples/themes/Theme.js +94 -0
- package/lib/examples/themes/Theme.js.map +1 -0
- package/lib/hooks/useModal.d.ts +2 -0
- package/lib/hooks/useModal.js +39 -0
- package/lib/hooks/useModal.js.map +1 -0
- package/lib/images/yellow-flower-small.jpg +0 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.js +55 -0
- package/lib/index.js.map +1 -0
- package/lib/jupyter/index.d.ts +0 -0
- package/lib/jupyter/index.js +6 -0
- package/lib/jupyter/index.js.map +1 -0
- package/lib/jupyter/lab/Example.d.ts +1 -0
- package/lib/jupyter/lab/Example.js +11 -0
- package/lib/jupyter/lab/Example.js.map +1 -0
- package/lib/jupyter/lab/__tests__/datalayer.spec.d.ts +0 -0
- package/lib/jupyter/lab/__tests__/datalayer.spec.js +11 -0
- package/lib/jupyter/lab/__tests__/datalayer.spec.js.map +1 -0
- package/lib/jupyter/lab/component/MockComponent.d.ts +2 -0
- package/lib/jupyter/lab/component/MockComponent.js +17 -0
- package/lib/jupyter/lab/component/MockComponent.js.map +1 -0
- package/lib/jupyter/lab/component/MockTab1.d.ts +2 -0
- package/lib/jupyter/lab/component/MockTab1.js +14 -0
- package/lib/jupyter/lab/component/MockTab1.js.map +1 -0
- package/lib/jupyter/lab/handler.d.ts +8 -0
- package/lib/jupyter/lab/handler.js +41 -0
- package/lib/jupyter/lab/handler.js.map +1 -0
- package/lib/jupyter/lab/index.d.ts +7 -0
- package/lib/jupyter/lab/index.js +73 -0
- package/lib/jupyter/lab/index.js.map +1 -0
- package/lib/jupyter/lab/widget.d.ts +6 -0
- package/lib/jupyter/lab/widget.js +18 -0
- package/lib/jupyter/lab/widget.js.map +1 -0
- package/lib/nodes/EquationNode.d.ts +31 -0
- package/lib/nodes/EquationNode.js +118 -0
- package/lib/nodes/EquationNode.js.map +1 -0
- package/lib/nodes/ImageNode.css +50 -0
- package/lib/nodes/ImageNode.d.ts +58 -0
- package/lib/nodes/ImageNode.js +275 -0
- package/lib/nodes/ImageNode.js.map +1 -0
- package/lib/nodes/JupyterCodeHighlightNode.d.ts +49 -0
- package/lib/nodes/JupyterCodeHighlightNode.js +165 -0
- package/lib/nodes/JupyterCodeHighlightNode.js.map +1 -0
- package/lib/nodes/JupyterCodeHighlighter.d.ts +28 -0
- package/lib/nodes/JupyterCodeHighlighter.js +522 -0
- package/lib/nodes/JupyterCodeHighlighter.js.map +1 -0
- package/lib/nodes/JupyterCodeNode.d.ts +50 -0
- package/lib/nodes/JupyterCodeNode.js +277 -0
- package/lib/nodes/JupyterCodeNode.js.map +1 -0
- package/lib/nodes/JupyterOutputNode.d.ts +58 -0
- package/lib/nodes/JupyterOutputNode.js +144 -0
- package/lib/nodes/JupyterOutputNode.js.map +1 -0
- package/lib/nodes/YouTubeNode.d.ts +28 -0
- package/lib/nodes/YouTubeNode.js +56 -0
- package/lib/nodes/YouTubeNode.js.map +1 -0
- package/lib/plugins/AutoEmbedPlugin.d.ts +17 -0
- package/lib/plugins/AutoEmbedPlugin.js +110 -0
- package/lib/plugins/AutoEmbedPlugin.js.map +1 -0
- package/lib/plugins/AutoLinkPlugin.d.ts +2 -0
- package/lib/plugins/AutoLinkPlugin.js +34 -0
- package/lib/plugins/AutoLinkPlugin.js.map +1 -0
- package/lib/plugins/CodeActionMenuPlugin.css +52 -0
- package/lib/plugins/CodeActionMenuPlugin.d.ts +12 -0
- package/lib/plugins/CodeActionMenuPlugin.js +108 -0
- package/lib/plugins/CodeActionMenuPlugin.js.map +1 -0
- package/lib/plugins/ComponentPickerMenuPlugin.d.ts +2 -0
- package/lib/plugins/ComponentPickerMenuPlugin.js +244 -0
- package/lib/plugins/ComponentPickerMenuPlugin.js.map +1 -0
- package/lib/plugins/EquationsPlugin.d.ts +21 -0
- package/lib/plugins/EquationsPlugin.js +48 -0
- package/lib/plugins/EquationsPlugin.js.map +1 -0
- package/lib/plugins/HorizontalRulePlugin.d.ts +2 -0
- package/lib/plugins/HorizontalRulePlugin.js +40 -0
- package/lib/plugins/HorizontalRulePlugin.js.map +1 -0
- package/lib/plugins/ImagesPlugin.d.ts +25 -0
- package/lib/plugins/ImagesPlugin.js +212 -0
- package/lib/plugins/ImagesPlugin.js.map +1 -0
- package/lib/plugins/JupyterPlugin.css +13 -0
- package/lib/plugins/JupyterPlugin.d.ts +16 -0
- package/lib/plugins/JupyterPlugin.js +169 -0
- package/lib/plugins/JupyterPlugin.js.map +1 -0
- package/lib/plugins/ListMaxIndentLevelPlugin.d.ts +4 -0
- package/lib/plugins/ListMaxIndentLevelPlugin.js +49 -0
- package/lib/plugins/ListMaxIndentLevelPlugin.js.map +1 -0
- package/lib/plugins/MardownPlugin.d.ts +2 -0
- package/lib/plugins/MardownPlugin.js +20 -0
- package/lib/plugins/MardownPlugin.js.map +1 -0
- package/lib/plugins/NbformatContentPlugin.d.ts +6 -0
- package/lib/plugins/NbformatContentPlugin.js +20 -0
- package/lib/plugins/NbformatContentPlugin.js.map +1 -0
- package/lib/plugins/TableOfContentsPlugin.css +87 -0
- package/lib/plugins/TableOfContentsPlugin.d.ts +3 -0
- package/lib/plugins/TableOfContentsPlugin.js +115 -0
- package/lib/plugins/TableOfContentsPlugin.js.map +1 -0
- package/lib/plugins/YouTubePlugin.d.ts +4 -0
- package/lib/plugins/YouTubePlugin.js +34 -0
- package/lib/plugins/YouTubePlugin.js.map +1 -0
- package/lib/ui/Button.css +40 -0
- package/lib/ui/Button.d.ts +18 -0
- package/lib/ui/Button.js +8 -0
- package/lib/ui/Button.js.map +1 -0
- package/lib/ui/ContentEditable.css +24 -0
- package/lib/ui/ContentEditable.d.ts +5 -0
- package/lib/ui/ContentEditable.js +20 -0
- package/lib/ui/ContentEditable.js.map +1 -0
- package/lib/ui/CopyButton.d.ts +7 -0
- package/lib/ui/CopyButton.js +47 -0
- package/lib/ui/CopyButton.js.map +1 -0
- package/lib/ui/Dialog.css +23 -0
- package/lib/ui/Dialog.d.ts +16 -0
- package/lib/ui/Dialog.js +21 -0
- package/lib/ui/Dialog.js.map +1 -0
- package/lib/ui/DropDown.d.ts +23 -0
- package/lib/ui/DropDown.js +119 -0
- package/lib/ui/DropDown.js.map +1 -0
- package/lib/ui/EquationEditor.css +42 -0
- package/lib/ui/EquationEditor.d.ts +18 -0
- package/lib/ui/EquationEditor.js +31 -0
- package/lib/ui/EquationEditor.js.map +1 -0
- package/lib/ui/FileInput.d.ts +15 -0
- package/lib/ui/FileInput.js +18 -0
- package/lib/ui/FileInput.js.map +1 -0
- package/lib/ui/ImageResizer.d.ts +16 -0
- package/lib/ui/ImageResizer.js +166 -0
- package/lib/ui/ImageResizer.js.map +1 -0
- package/lib/ui/Input.css +37 -0
- package/lib/ui/KatexEquationAlterer.css +45 -0
- package/lib/ui/KatexEquationAlterer.d.ts +7 -0
- package/lib/ui/KatexEquationAlterer.js +33 -0
- package/lib/ui/KatexEquationAlterer.js.map +1 -0
- package/lib/ui/KatexRenderer.d.ts +6 -0
- package/lib/ui/KatexRenderer.js +36 -0
- package/lib/ui/KatexRenderer.js.map +1 -0
- package/lib/ui/Modal.css +67 -0
- package/lib/ui/Modal.d.ts +15 -0
- package/lib/ui/Modal.js +58 -0
- package/lib/ui/Modal.js.map +1 -0
- package/lib/ui/Placeholder.css +29 -0
- package/lib/ui/Placeholder.d.ts +14 -0
- package/lib/ui/Placeholder.js +7 -0
- package/lib/ui/Placeholder.js.map +1 -0
- package/lib/ui/PrettierButton.css +20 -0
- package/lib/ui/PrettierButton.tsx_tmp +133 -0
- package/lib/ui/TextInput.d.ts +16 -0
- package/lib/ui/TextInput.js +20 -0
- package/lib/ui/TextInput.js.map +1 -0
- package/lib/utils/canUseDOM.d.ts +8 -0
- package/lib/utils/canUseDOM.js +16 -0
- package/lib/utils/canUseDOM.js.map +1 -0
- package/lib/utils/debouncer.d.ts +1 -0
- package/lib/utils/debouncer.js +24 -0
- package/lib/utils/debouncer.js.map +1 -0
- package/lib/utils/invariant.d.ts +8 -0
- package/lib/utils/invariant.js +23 -0
- package/lib/utils/invariant.js.map +1 -0
- package/lib/utils/join.d.ts +8 -0
- package/lib/utils/join.js +16 -0
- package/lib/utils/join.js.map +1 -0
- package/lib/utils/selection.d.ts +8 -0
- package/lib/utils/selection.js +14 -0
- package/lib/utils/selection.js.map +1 -0
- package/lib/utils/useLayoutEffect.d.ts +10 -0
- package/lib/utils/useLayoutEffect.js +19 -0
- package/lib/utils/useLayoutEffect.js.map +1 -0
- package/package.json +166 -0
- package/style/base.css +16 -0
- package/style/index.css +7 -0
- package/style/index.js +7 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-2023 Datalayer, Inc.
|
|
3
|
+
*
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
import * as Prism from 'prismjs';
|
|
7
|
+
import 'prismjs/components/prism-clike';
|
|
8
|
+
import 'prismjs/components/prism-javascript';
|
|
9
|
+
import 'prismjs/components/prism-markup';
|
|
10
|
+
import 'prismjs/components/prism-markdown';
|
|
11
|
+
import 'prismjs/components/prism-c';
|
|
12
|
+
import 'prismjs/components/prism-css';
|
|
13
|
+
import 'prismjs/components/prism-objectivec';
|
|
14
|
+
import 'prismjs/components/prism-sql';
|
|
15
|
+
import 'prismjs/components/prism-python';
|
|
16
|
+
import 'prismjs/components/prism-rust';
|
|
17
|
+
import 'prismjs/components/prism-swift';
|
|
18
|
+
import { mergeRegister } from '@lexical/utils';
|
|
19
|
+
import { $createLineBreakNode, $createTextNode, $getNodeByKey, $getSelection, $isLineBreakNode, $isRangeSelection, $isTextNode, COMMAND_PRIORITY_LOW, INDENT_CONTENT_COMMAND, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, MOVE_TO_END, MOVE_TO_START, OUTDENT_CONTENT_COMMAND, TextNode, } from 'lexical';
|
|
20
|
+
import { $createJupyterCodeHighlightNode, $isJupyterCodeHighlightNode, JupyterCodeHighlightNode, DEFAULT_CODE_LANGUAGE, getFirstJupyterCodeHighlightNodeOfLine, getLastJupyterCodeHighlightNodeOfLine, } from './JupyterCodeHighlightNode';
|
|
21
|
+
import { $isJupyterCodeNode, JupyterCodeNode } from './JupyterCodeNode';
|
|
22
|
+
function isSpaceOrTabChar(char) {
|
|
23
|
+
return char === ' ' || char === '\t';
|
|
24
|
+
}
|
|
25
|
+
function findFirstNotSpaceOrTabCharAtText(text, isForward) {
|
|
26
|
+
const length = text.length;
|
|
27
|
+
let offset = -1;
|
|
28
|
+
if (isForward) {
|
|
29
|
+
for (let i = 0; i < length; i++) {
|
|
30
|
+
const char = text[i];
|
|
31
|
+
if (!isSpaceOrTabChar(char)) {
|
|
32
|
+
offset = i;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
for (let i = length - 1; i > -1; i--) {
|
|
39
|
+
const char = text[i];
|
|
40
|
+
if (!isSpaceOrTabChar(char)) {
|
|
41
|
+
offset = i;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return offset;
|
|
47
|
+
}
|
|
48
|
+
export function getStartOfCodeInLine(anchor) {
|
|
49
|
+
let currentNode = null;
|
|
50
|
+
let currentNodeOffset = -1;
|
|
51
|
+
const previousSiblings = anchor.getPreviousSiblings();
|
|
52
|
+
previousSiblings.push(anchor);
|
|
53
|
+
while (previousSiblings.length > 0) {
|
|
54
|
+
const node = previousSiblings.pop();
|
|
55
|
+
if ($isJupyterCodeHighlightNode(node)) {
|
|
56
|
+
const text = node.getTextContent();
|
|
57
|
+
const offset = findFirstNotSpaceOrTabCharAtText(text, true);
|
|
58
|
+
if (offset !== -1) {
|
|
59
|
+
currentNode = node;
|
|
60
|
+
currentNodeOffset = offset;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if ($isLineBreakNode(node)) {
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (currentNode === null) {
|
|
68
|
+
const nextSiblings = anchor.getNextSiblings();
|
|
69
|
+
while (nextSiblings.length > 0) {
|
|
70
|
+
const node = nextSiblings.shift();
|
|
71
|
+
if ($isJupyterCodeHighlightNode(node)) {
|
|
72
|
+
const text = node.getTextContent();
|
|
73
|
+
const offset = findFirstNotSpaceOrTabCharAtText(text, true);
|
|
74
|
+
if (offset !== -1) {
|
|
75
|
+
currentNode = node;
|
|
76
|
+
currentNodeOffset = offset;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if ($isLineBreakNode(node)) {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
node: currentNode,
|
|
87
|
+
offset: currentNodeOffset,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function getEndOfJupyterCodeInLine(anchor) {
|
|
91
|
+
let currentNode = null;
|
|
92
|
+
let currentNodeOffset = -1;
|
|
93
|
+
const nextSiblings = anchor.getNextSiblings();
|
|
94
|
+
nextSiblings.unshift(anchor);
|
|
95
|
+
while (nextSiblings.length > 0) {
|
|
96
|
+
const node = nextSiblings.shift();
|
|
97
|
+
if ($isJupyterCodeHighlightNode(node)) {
|
|
98
|
+
const text = node.getTextContent();
|
|
99
|
+
const offset = findFirstNotSpaceOrTabCharAtText(text, false);
|
|
100
|
+
if (offset !== -1) {
|
|
101
|
+
currentNode = node;
|
|
102
|
+
currentNodeOffset = offset + 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if ($isLineBreakNode(node)) {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (currentNode === null) {
|
|
110
|
+
const previousSiblings = anchor.getPreviousSiblings();
|
|
111
|
+
while (previousSiblings.length > 0) {
|
|
112
|
+
const node = previousSiblings.pop();
|
|
113
|
+
if ($isJupyterCodeHighlightNode(node)) {
|
|
114
|
+
const text = node.getTextContent();
|
|
115
|
+
const offset = findFirstNotSpaceOrTabCharAtText(text, false);
|
|
116
|
+
if (offset !== -1) {
|
|
117
|
+
currentNode = node;
|
|
118
|
+
currentNodeOffset = offset + 1;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if ($isLineBreakNode(node)) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
node: currentNode,
|
|
129
|
+
offset: currentNodeOffset,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function textNodeTransform(node, editor) {
|
|
133
|
+
// Since CodeNode has flat children structure we only need to check
|
|
134
|
+
// if node's parent is a code node and run highlighting if so
|
|
135
|
+
const parentNode = node.getParent();
|
|
136
|
+
if ($isJupyterCodeNode(parentNode)) {
|
|
137
|
+
codeNodeTransform(parentNode, editor);
|
|
138
|
+
}
|
|
139
|
+
else if ($isJupyterCodeHighlightNode(node)) {
|
|
140
|
+
// When code block converted into paragraph or other element
|
|
141
|
+
// code highlight nodes converted back to normal text
|
|
142
|
+
node.replace($createTextNode(node.__text));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function updateCodeGutter(node, editor) {
|
|
146
|
+
const codeElement = editor.getElementByKey(node.getKey());
|
|
147
|
+
if (codeElement === null) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const children = node.getChildren();
|
|
151
|
+
const childrenLength = children.length;
|
|
152
|
+
// @ts-ignore: internal field
|
|
153
|
+
if (childrenLength === codeElement.__cachedChildrenLength) {
|
|
154
|
+
// Avoid updating the attribute if the children length hasn't changed.
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// @ts-ignore:: internal field
|
|
158
|
+
codeElement.__cachedChildrenLength = childrenLength;
|
|
159
|
+
let gutter = '1';
|
|
160
|
+
let count = 1;
|
|
161
|
+
for (let i = 0; i < childrenLength; i++) {
|
|
162
|
+
if ($isLineBreakNode(children[i])) {
|
|
163
|
+
gutter += '\n' + ++count;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
codeElement.setAttribute('data-gutter', gutter);
|
|
167
|
+
}
|
|
168
|
+
// Using `skipTransforms` to prevent extra transforms since reformatting the code
|
|
169
|
+
// will not affect code block content itself.
|
|
170
|
+
//
|
|
171
|
+
// Using extra flag (`isHighlighting`) since both CodeNode and CodeHighlightNode
|
|
172
|
+
// transforms might be called at the same time (e.g. new CodeHighlight node inserted) and
|
|
173
|
+
// in both cases we'll rerun whole reformatting over CodeNode, which is redundant.
|
|
174
|
+
// Especially when pasting code into CodeBlock.
|
|
175
|
+
let isHighlighting = false;
|
|
176
|
+
function codeNodeTransform(node, editor) {
|
|
177
|
+
if (isHighlighting) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
isHighlighting = true;
|
|
181
|
+
// When new code block inserted it might not have language selected
|
|
182
|
+
if (node.getLanguage() === undefined) {
|
|
183
|
+
node.setLanguage(DEFAULT_CODE_LANGUAGE);
|
|
184
|
+
}
|
|
185
|
+
// Using nested update call to pass `skipTransforms` since we don't want
|
|
186
|
+
// each individual codehighlight node to be transformed again as it's already
|
|
187
|
+
// in its final state
|
|
188
|
+
editor.update(() => {
|
|
189
|
+
updateAndRetainSelection(node, () => {
|
|
190
|
+
const code = node.getTextContent();
|
|
191
|
+
const tokens = Prism.tokenize(code, Prism.languages[node.getLanguage() || ''] ||
|
|
192
|
+
Prism.languages[DEFAULT_CODE_LANGUAGE]);
|
|
193
|
+
const highlightNodes = getHighlightNodes(tokens);
|
|
194
|
+
const diffRange = getDiffRange(node.getChildren(), highlightNodes);
|
|
195
|
+
const { from, to, nodesForReplacement } = diffRange;
|
|
196
|
+
if (from !== to || nodesForReplacement.length) {
|
|
197
|
+
node.splice(from, to - from, nodesForReplacement);
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
});
|
|
202
|
+
}, {
|
|
203
|
+
onUpdate: () => {
|
|
204
|
+
isHighlighting = false;
|
|
205
|
+
},
|
|
206
|
+
skipTransforms: true,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function getHighlightNodes(tokens) {
|
|
210
|
+
const nodes = [];
|
|
211
|
+
tokens.forEach((token) => {
|
|
212
|
+
if (typeof token === 'string') {
|
|
213
|
+
const partials = token.split('\n');
|
|
214
|
+
for (let i = 0; i < partials.length; i++) {
|
|
215
|
+
const text = partials[i];
|
|
216
|
+
if (text.length) {
|
|
217
|
+
nodes.push($createJupyterCodeHighlightNode(text));
|
|
218
|
+
}
|
|
219
|
+
if (i < partials.length - 1) {
|
|
220
|
+
nodes.push($createLineBreakNode());
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const { content } = token;
|
|
226
|
+
if (typeof content === 'string') {
|
|
227
|
+
nodes.push($createJupyterCodeHighlightNode(content, token.type));
|
|
228
|
+
}
|
|
229
|
+
else if (Array.isArray(content) &&
|
|
230
|
+
content.length === 1 &&
|
|
231
|
+
typeof content[0] === 'string') {
|
|
232
|
+
nodes.push($createJupyterCodeHighlightNode(content[0], token.type));
|
|
233
|
+
}
|
|
234
|
+
else if (Array.isArray(content)) {
|
|
235
|
+
nodes.push(...getHighlightNodes(content));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return nodes;
|
|
240
|
+
}
|
|
241
|
+
// Wrapping update function into selection retainer, that tries to keep cursor at the same
|
|
242
|
+
// position as before.
|
|
243
|
+
function updateAndRetainSelection(node, updateFn) {
|
|
244
|
+
const selection = $getSelection();
|
|
245
|
+
if (!$isRangeSelection(selection) || !selection.anchor) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const anchor = selection.anchor;
|
|
249
|
+
const anchorOffset = anchor.offset;
|
|
250
|
+
const isNewLineAnchor = anchor.type === 'element' &&
|
|
251
|
+
$isLineBreakNode(node.getChildAtIndex(anchor.offset - 1));
|
|
252
|
+
let textOffset = 0;
|
|
253
|
+
// Calculating previous text offset (all text node prior to anchor + anchor own text offset)
|
|
254
|
+
if (!isNewLineAnchor) {
|
|
255
|
+
const anchorNode = anchor.getNode();
|
|
256
|
+
textOffset =
|
|
257
|
+
anchorOffset +
|
|
258
|
+
anchorNode.getPreviousSiblings().reduce((offset, _node) => {
|
|
259
|
+
return (offset + ($isLineBreakNode(_node) ? 0 : _node.getTextContentSize()));
|
|
260
|
+
}, 0);
|
|
261
|
+
}
|
|
262
|
+
const hasChanges = updateFn();
|
|
263
|
+
if (!hasChanges) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// Non-text anchors only happen for line breaks, otherwise
|
|
267
|
+
// selection will be within text node (code highlight node)
|
|
268
|
+
if (isNewLineAnchor) {
|
|
269
|
+
anchor.getNode().select(anchorOffset, anchorOffset);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// If it was non-element anchor then we walk through child nodes
|
|
273
|
+
// and looking for a position of original text offset
|
|
274
|
+
node.getChildren().some((_node) => {
|
|
275
|
+
if ($isTextNode(_node)) {
|
|
276
|
+
const textContentSize = _node.getTextContentSize();
|
|
277
|
+
if (textContentSize >= textOffset) {
|
|
278
|
+
_node.select(textOffset, textOffset);
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
textOffset -= textContentSize;
|
|
282
|
+
}
|
|
283
|
+
return false;
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
// Finds minimal diff range between two nodes lists. It returns from/to range boundaries of prevNodes
|
|
287
|
+
// that needs to be replaced with `nodes` (subset of nextNodes) to make prevNodes equal to nextNodes.
|
|
288
|
+
function getDiffRange(prevNodes, nextNodes) {
|
|
289
|
+
let leadingMatch = 0;
|
|
290
|
+
while (leadingMatch < prevNodes.length) {
|
|
291
|
+
if (!isEqual(prevNodes[leadingMatch], nextNodes[leadingMatch])) {
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
leadingMatch++;
|
|
295
|
+
}
|
|
296
|
+
const prevNodesLength = prevNodes.length;
|
|
297
|
+
const nextNodesLength = nextNodes.length;
|
|
298
|
+
const maxTrailingMatch = Math.min(prevNodesLength, nextNodesLength) - leadingMatch;
|
|
299
|
+
let trailingMatch = 0;
|
|
300
|
+
while (trailingMatch < maxTrailingMatch) {
|
|
301
|
+
trailingMatch++;
|
|
302
|
+
if (!isEqual(prevNodes[prevNodesLength - trailingMatch], nextNodes[nextNodesLength - trailingMatch])) {
|
|
303
|
+
trailingMatch--;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const from = leadingMatch;
|
|
308
|
+
const to = prevNodesLength - trailingMatch;
|
|
309
|
+
const nodesForReplacement = nextNodes.slice(leadingMatch, nextNodesLength - trailingMatch);
|
|
310
|
+
return {
|
|
311
|
+
from,
|
|
312
|
+
nodesForReplacement,
|
|
313
|
+
to,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function isEqual(nodeA, nodeB) {
|
|
317
|
+
// Only checking for code higlight nodes and linebreaks. If it's regular text node
|
|
318
|
+
// returning false so that it's transformed into code highlight node
|
|
319
|
+
if ($isJupyterCodeHighlightNode(nodeA) && $isJupyterCodeHighlightNode(nodeB)) {
|
|
320
|
+
return (nodeA.__text === nodeB.__text &&
|
|
321
|
+
nodeA.__highlightType === nodeB.__highlightType);
|
|
322
|
+
}
|
|
323
|
+
if ($isLineBreakNode(nodeA) && $isLineBreakNode(nodeB)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
function handleMultilineIndent(type) {
|
|
329
|
+
const selection = $getSelection();
|
|
330
|
+
if (!$isRangeSelection(selection) || selection.isCollapsed()) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
// Only run multiline indent logic on selections exclusively composed of code highlights and linebreaks
|
|
334
|
+
const nodes = selection.getNodes();
|
|
335
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
336
|
+
const node = nodes[i];
|
|
337
|
+
if (!$isJupyterCodeHighlightNode(node) && !$isLineBreakNode(node)) {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const startOfLine = getFirstJupyterCodeHighlightNodeOfLine(nodes[0]);
|
|
342
|
+
if (startOfLine != null) {
|
|
343
|
+
doIndent(startOfLine, type);
|
|
344
|
+
}
|
|
345
|
+
for (let i = 1; i < nodes.length; i++) {
|
|
346
|
+
const node = nodes[i];
|
|
347
|
+
if ($isLineBreakNode(nodes[i - 1]) && $isJupyterCodeHighlightNode(node)) {
|
|
348
|
+
doIndent(node, type);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
function doIndent(node, type) {
|
|
354
|
+
const text = node.getTextContent();
|
|
355
|
+
if (type === INDENT_CONTENT_COMMAND) {
|
|
356
|
+
// If the codeblock node doesn't start with whitespace, we don't want to
|
|
357
|
+
// naively prepend a '\t'; Prism will then mangle all of our nodes when
|
|
358
|
+
// it separates the whitespace from the first non-whitespace node. This
|
|
359
|
+
// will lead to selection bugs when indenting lines that previously
|
|
360
|
+
// didn't start with a whitespace character
|
|
361
|
+
if (text.length > 0 && /\s/.test(text[0])) {
|
|
362
|
+
node.setTextContent('\t' + text);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
const indentNode = $createJupyterCodeHighlightNode('\t');
|
|
366
|
+
node.insertBefore(indentNode);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
if (text.indexOf('\t') === 0) {
|
|
371
|
+
// Same as above - if we leave empty text nodes lying around, the resulting
|
|
372
|
+
// selection will be mangled
|
|
373
|
+
if (text.length === 1) {
|
|
374
|
+
node.remove();
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
node.setTextContent(text.substring(1));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function handleShiftLines(type, event) {
|
|
383
|
+
// We only care about the alt+arrow keys
|
|
384
|
+
const selection = $getSelection();
|
|
385
|
+
if (!$isRangeSelection(selection)) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
// I'm not quite sure why, but it seems like calling anchor.getNode() collapses the selection here
|
|
389
|
+
// So first, get the anchor and the focus, then get their nodes
|
|
390
|
+
const { anchor, focus } = selection;
|
|
391
|
+
const anchorOffset = anchor.offset;
|
|
392
|
+
const focusOffset = focus.offset;
|
|
393
|
+
const anchorNode = anchor.getNode();
|
|
394
|
+
const focusNode = focus.getNode();
|
|
395
|
+
const arrowIsUp = type === KEY_ARROW_UP_COMMAND;
|
|
396
|
+
// Ensure the selection is within the codeblock
|
|
397
|
+
if (!$isJupyterCodeHighlightNode(anchorNode) || !$isJupyterCodeHighlightNode(focusNode)) {
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
if (!event.altKey) {
|
|
401
|
+
// Handle moving selection out of the code block, given there are no
|
|
402
|
+
// sibling thats can natively take the selection.
|
|
403
|
+
if (selection.isCollapsed()) {
|
|
404
|
+
const codeNode = anchorNode.getParentOrThrow();
|
|
405
|
+
if (arrowIsUp &&
|
|
406
|
+
anchorOffset === 0 &&
|
|
407
|
+
anchorNode.getPreviousSibling() === null) {
|
|
408
|
+
const codeNodeSibling = codeNode.getPreviousSibling();
|
|
409
|
+
if (codeNodeSibling === null) {
|
|
410
|
+
codeNode.selectPrevious();
|
|
411
|
+
event.preventDefault();
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
else if (!arrowIsUp &&
|
|
416
|
+
anchorOffset === anchorNode.getTextContentSize() &&
|
|
417
|
+
anchorNode.getNextSibling() === null) {
|
|
418
|
+
const codeNodeSibling = codeNode.getNextSibling();
|
|
419
|
+
if (codeNodeSibling === null) {
|
|
420
|
+
codeNode.selectNext();
|
|
421
|
+
event.preventDefault();
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
const start = getFirstJupyterCodeHighlightNodeOfLine(anchorNode);
|
|
429
|
+
const end = getLastJupyterCodeHighlightNodeOfLine(focusNode);
|
|
430
|
+
if (start == null || end == null) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
const range = start.getNodesBetween(end);
|
|
434
|
+
for (let i = 0; i < range.length; i++) {
|
|
435
|
+
const node = range[i];
|
|
436
|
+
if (!$isJupyterCodeHighlightNode(node) && !$isLineBreakNode(node)) {
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// After this point, we know the selection is within the codeblock. We may not be able to
|
|
441
|
+
// actually move the lines around, but we want to return true either way to prevent
|
|
442
|
+
// the event's default behavior
|
|
443
|
+
event.preventDefault();
|
|
444
|
+
event.stopPropagation(); // required to stop cursor movement under Firefox
|
|
445
|
+
const linebreak = arrowIsUp
|
|
446
|
+
? start.getPreviousSibling()
|
|
447
|
+
: end.getNextSibling();
|
|
448
|
+
if (!$isLineBreakNode(linebreak)) {
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
const sibling = arrowIsUp
|
|
452
|
+
? linebreak.getPreviousSibling()
|
|
453
|
+
: linebreak.getNextSibling();
|
|
454
|
+
if (sibling == null) {
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
const maybeInsertionPoint = arrowIsUp
|
|
458
|
+
? getFirstJupyterCodeHighlightNodeOfLine(sibling)
|
|
459
|
+
: getLastJupyterCodeHighlightNodeOfLine(sibling);
|
|
460
|
+
let insertionPoint = maybeInsertionPoint != null ? maybeInsertionPoint : sibling;
|
|
461
|
+
linebreak.remove();
|
|
462
|
+
range.forEach((node) => node.remove());
|
|
463
|
+
if (type === KEY_ARROW_UP_COMMAND) {
|
|
464
|
+
range.forEach((node) => insertionPoint.insertBefore(node));
|
|
465
|
+
insertionPoint.insertBefore(linebreak);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
insertionPoint.insertAfter(linebreak);
|
|
469
|
+
insertionPoint = linebreak;
|
|
470
|
+
range.forEach((node) => {
|
|
471
|
+
insertionPoint.insertAfter(node);
|
|
472
|
+
insertionPoint = node;
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
selection.setTextNodeRange(anchorNode, anchorOffset, focusNode, focusOffset);
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
function handleMoveTo(type, event) {
|
|
479
|
+
const selection = $getSelection();
|
|
480
|
+
if (!$isRangeSelection(selection)) {
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
const { anchor, focus } = selection;
|
|
484
|
+
const anchorNode = anchor.getNode();
|
|
485
|
+
const focusNode = focus.getNode();
|
|
486
|
+
const isMoveToStart = type === MOVE_TO_START;
|
|
487
|
+
if (!$isJupyterCodeHighlightNode(anchorNode) || !$isJupyterCodeHighlightNode(focusNode)) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
let node;
|
|
491
|
+
let offset;
|
|
492
|
+
if (isMoveToStart) {
|
|
493
|
+
({ node, offset } = getStartOfCodeInLine(focusNode));
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
({ node, offset } = getEndOfJupyterCodeInLine(focusNode));
|
|
497
|
+
}
|
|
498
|
+
if (node !== null && offset !== -1) {
|
|
499
|
+
selection.setTextNodeRange(node, offset, node, offset);
|
|
500
|
+
}
|
|
501
|
+
event.preventDefault();
|
|
502
|
+
event.stopPropagation();
|
|
503
|
+
return true;
|
|
504
|
+
}
|
|
505
|
+
export function registerCodeHighlighting(editor) {
|
|
506
|
+
if (!editor.hasNodes([JupyterCodeNode, JupyterCodeHighlightNode])) {
|
|
507
|
+
throw new Error('CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor');
|
|
508
|
+
}
|
|
509
|
+
return mergeRegister(editor.registerMutationListener(JupyterCodeNode, (mutations) => {
|
|
510
|
+
editor.update(() => {
|
|
511
|
+
for (const [key, type] of mutations) {
|
|
512
|
+
if (type !== 'destroyed') {
|
|
513
|
+
const node = $getNodeByKey(key);
|
|
514
|
+
if (node !== null) {
|
|
515
|
+
updateCodeGutter(node, editor);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
}), editor.registerNodeTransform(JupyterCodeNode, (node) => codeNodeTransform(node, editor)), editor.registerNodeTransform(TextNode, (node) => textNodeTransform(node, editor)), editor.registerNodeTransform(JupyterCodeHighlightNode, (node) => textNodeTransform(node, editor)), editor.registerCommand(INDENT_CONTENT_COMMAND, (payload) => handleMultilineIndent(INDENT_CONTENT_COMMAND), COMMAND_PRIORITY_LOW), editor.registerCommand(OUTDENT_CONTENT_COMMAND, (payload) => handleMultilineIndent(OUTDENT_CONTENT_COMMAND), COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_ARROW_UP_COMMAND, (payload) => handleShiftLines(KEY_ARROW_UP_COMMAND, payload), COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_ARROW_DOWN_COMMAND, (payload) => handleShiftLines(KEY_ARROW_DOWN_COMMAND, payload), COMMAND_PRIORITY_LOW), editor.registerCommand(MOVE_TO_END, (payload) => handleMoveTo(MOVE_TO_END, payload), COMMAND_PRIORITY_LOW), editor.registerCommand(MOVE_TO_START, (payload) => handleMoveTo(MOVE_TO_START, payload), COMMAND_PRIORITY_LOW));
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=JupyterCodeHighlighter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JupyterCodeHighlighter.js","sourceRoot":"","sources":["../../src/nodes/JupyterCodeHighlighter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
import type { DOMConversionMap, EditorConfig, LexicalNode, NodeKey, ParagraphNode, RangeSelection, SerializedElementNode, Spread } from 'lexical';
|
|
8
|
+
import { ElementNode } from 'lexical';
|
|
9
|
+
import type { JupyterCodeHighlightNode } from './JupyterCodeHighlightNode';
|
|
10
|
+
import 'prismjs/components/prism-clike';
|
|
11
|
+
import 'prismjs/components/prism-javascript';
|
|
12
|
+
import 'prismjs/components/prism-markup';
|
|
13
|
+
import 'prismjs/components/prism-markdown';
|
|
14
|
+
import 'prismjs/components/prism-c';
|
|
15
|
+
import 'prismjs/components/prism-css';
|
|
16
|
+
import 'prismjs/components/prism-objectivec';
|
|
17
|
+
import 'prismjs/components/prism-sql';
|
|
18
|
+
import 'prismjs/components/prism-python';
|
|
19
|
+
import 'prismjs/components/prism-rust';
|
|
20
|
+
import 'prismjs/components/prism-swift';
|
|
21
|
+
type SerializedCodeNode = Spread<{
|
|
22
|
+
language: string | null | undefined;
|
|
23
|
+
type: 'jupyter-code';
|
|
24
|
+
codeNodeUuid: string;
|
|
25
|
+
version: 1;
|
|
26
|
+
}, SerializedElementNode>;
|
|
27
|
+
export declare class JupyterCodeNode extends ElementNode {
|
|
28
|
+
/** @internal */
|
|
29
|
+
__language: string | null | undefined;
|
|
30
|
+
__codeNodeUuid: string;
|
|
31
|
+
static getType(): string;
|
|
32
|
+
static clone(node: JupyterCodeNode): JupyterCodeNode;
|
|
33
|
+
constructor(language?: string | null | undefined, codeNodeUuid?: string, key?: NodeKey);
|
|
34
|
+
setCodeNodeUuid(codeNodeUuid: string): void;
|
|
35
|
+
getCodeNodeUuid(): string;
|
|
36
|
+
createDOM(config: EditorConfig): HTMLElement;
|
|
37
|
+
updateDOM(prevNode: JupyterCodeNode, dom: HTMLElement): boolean;
|
|
38
|
+
static importDOM(): DOMConversionMap | null;
|
|
39
|
+
static importJSON(serializedNode: SerializedCodeNode): JupyterCodeNode;
|
|
40
|
+
exportJSON(): SerializedCodeNode;
|
|
41
|
+
insertNewAfter(selection: RangeSelection): null | ParagraphNode | JupyterCodeHighlightNode;
|
|
42
|
+
canInsertTab(): boolean;
|
|
43
|
+
canIndent(): false;
|
|
44
|
+
collapseAtStart(): true;
|
|
45
|
+
setLanguage(language: string): void;
|
|
46
|
+
getLanguage(): string | null | undefined;
|
|
47
|
+
}
|
|
48
|
+
export declare function $createJupyterCodeNode(language?: string | null | undefined, codeNodeUuid?: string): JupyterCodeNode;
|
|
49
|
+
export declare function $isJupyterCodeNode(node: LexicalNode | null | undefined): node is JupyterCodeNode;
|
|
50
|
+
export {};
|