DecoratorNode,
DOMConversion,
DOMConversionMap,
- DOMConversionOutput,
+ DOMConversionOutput, DOMExportOutput,
LexicalEditor, LexicalNode,
SerializedLexicalNode,
Spread
} from "lexical";
import type {EditorConfig} from "lexical/LexicalEditor";
-import {el} from "../helpers";
import {EditorDecoratorAdapter} from "../ui/framework/decorator";
-import {code} from "../ui/defaults/button-definitions";
+import {CodeEditor} from "../../components";
+import {el} from "../utils/dom";
export type SerializedCodeBlockNode = Spread<{
language: string;
}
static clone(node: CodeBlockNode): CodeBlockNode {
- return new CodeBlockNode(node.__language, node.__code);
+ const newNode = new CodeBlockNode(node.__language, node.__code, node.__key);
+ newNode.__id = node.__id;
+ return newNode;
}
constructor(language: string = '', code: string = '', key?: string) {
}
decorate(editor: LexicalEditor, config: EditorConfig): EditorDecoratorAdapter {
- // TODO
return {
type: 'code',
getNode: () => this,
return false;
}
+ exportDOM(editor: LexicalEditor): DOMExportOutput {
+ const dom = this.createDOM(editor._config, editor);
+ return {
+ element: dom.querySelector('pre') as HTMLElement,
+ };
+ }
+
static importDOM(): DOMConversionMap|null {
return {
pre(node: HTMLElement): DOMConversion|null {
|| '';
const code = codeEl ? (codeEl.textContent || '').trim() : (element.textContent || '').trim();
+ const node = $createCodeBlockNode(language, code);
- return {
- node: $createCodeBlockNode(language, code),
- };
+ if (element.id) {
+ node.setId(element.id);
+ }
+
+ return { node };
},
priority: 3,
};
export function $isCodeBlockNode(node: LexicalNode | null | undefined) {
return node instanceof CodeBlockNode;
+}
+
+export function $openCodeEditorForNode(editor: LexicalEditor, node: CodeBlockNode): void {
+ const code = node.getCode();
+ const language = node.getLanguage();
+
+ // @ts-ignore
+ const codeEditor = window.$components.first('code-editor') as CodeEditor;
+ // TODO - Handle direction
+ codeEditor.open(code, language, 'ltr', (newCode: string, newLang: string) => {
+ editor.update(() => {
+ node.setCode(newCode);
+ node.setLanguage(newLang);
+ });
+ // TODO - Re-focus
+ }, () => {
+ // TODO - Re-focus
+ });
}
\ No newline at end of file