1 import {EditorDecorator} from "../framework/decorator";
2 import {EditorUiContext} from "../framework/core";
3 import {$openCodeEditorForNode, CodeBlockNode} from "../../nodes/code-block";
4 import {ImageNode} from "../../nodes/image";
7 export class CodeBlockDecorator extends EditorDecorator {
9 protected completedSetup: boolean = false;
10 protected latestCode: string = '';
11 protected latestLanguage: string = '';
14 protected editor: any = null;
16 setup(context: EditorUiContext, element: HTMLElement) {
17 const codeNode = this.getNode() as CodeBlockNode;
18 const preEl = element.querySelector('pre');
27 this.latestCode = codeNode.__code;
28 this.latestLanguage = codeNode.__language;
29 const lines = this.latestCode.split('\n').length;
30 const height = (lines * 19.2) + 18 + 24;
31 element.style.height = `${height}px`;
33 const startTime = Date.now();
35 element.addEventListener('dblclick', event => {
36 context.editor.getEditorState().read(() => {
37 $openCodeEditorForNode(context.editor, (this.getNode() as CodeBlockNode));
42 const renderEditor = (Code) => {
43 this.editor = Code.wysiwygView(element, document, this.latestCode, this.latestLanguage);
45 element.style.height = '';
50 window.importVersioned('code').then((Code) => {
51 const timeout = (Date.now() - startTime < 20) ? 20 : 0;
52 setTimeout(() => renderEditor(Code), timeout);
55 this.completedSetup = true;
59 const codeNode = this.getNode() as CodeBlockNode;
60 const code = codeNode.getCode();
61 const language = codeNode.getLanguage();
63 if (this.latestCode === code && this.latestLanguage === language) {
66 this.latestLanguage = language;
67 this.latestCode = code;
70 this.editor.setContent(code);
71 this.editor.setMode(language, code);
75 render(context: EditorUiContext, element: HTMLElement): void {
76 if (this.completedSetup) {
79 this.setup(context, element);