|
1 | 1 | <script lang="ts"> |
| 2 | + import '$lib/utils/codemirror'; |
| 3 | +
|
2 | 4 | import { basicSetup, EditorView } from 'codemirror'; |
3 | 5 | import { keymap, placeholder } from '@codemirror/view'; |
4 | 6 | import { Compartment, EditorState } from '@codemirror/state'; |
5 | 7 |
|
6 | 8 | import { acceptCompletion } from '@codemirror/autocomplete'; |
7 | 9 | import { indentWithTab } from '@codemirror/commands'; |
8 | 10 |
|
9 | | - import { indentUnit, LanguageDescription } from '@codemirror/language'; |
| 11 | + import { indentUnit } from '@codemirror/language'; |
10 | 12 | import { languages } from '@codemirror/language-data'; |
11 | 13 |
|
12 | 14 | import { oneDark } from '@codemirror/theme-one-dark'; |
|
75 | 77 | export let id = ''; |
76 | 78 | export let lang = ''; |
77 | 79 |
|
78 | | - let codeEditor; |
| 80 | + let codeEditor: EditorView | null = null; |
79 | 81 |
|
80 | 82 | export const focus = () => { |
81 | | - codeEditor.focus(); |
| 83 | + codeEditor?.focus(); |
82 | 84 | }; |
83 | 85 |
|
84 | 86 | let isDarkMode = false; |
85 | 87 | let editorTheme = new Compartment(); |
86 | 88 | let editorLanguage = new Compartment(); |
87 | 89 |
|
88 | | - languages.push( |
89 | | - LanguageDescription.of({ |
90 | | - name: 'HCL', |
91 | | - extensions: ['hcl', 'tf'], |
92 | | - load() { |
93 | | - return import('codemirror-lang-hcl').then((m) => m.hcl()); |
94 | | - } |
95 | | - }) |
96 | | - ); |
97 | | - languages.push( |
98 | | - LanguageDescription.of({ |
99 | | - name: 'Elixir', |
100 | | - extensions: ['ex', 'exs'], |
101 | | - load() { |
102 | | - return import('codemirror-lang-elixir').then((m) => m.elixir()); |
103 | | - } |
104 | | - }) |
105 | | - ); |
106 | | -
|
107 | | - // Add 'matlab' alias to Octave language (MATLAB-compatible syntax) |
108 | | - const octaveLang = languages.find((l) => l.name === 'Octave'); |
109 | | - if (octaveLang && !octaveLang.alias.includes('matlab')) { |
110 | | - octaveLang.alias.push('matlab'); |
111 | | - } |
112 | | -
|
113 | 90 | const getLang = async () => { |
114 | 91 | const language = languages.find((l) => l.alias.includes(lang)); |
115 | 92 | return await language?.load(); |
@@ -326,6 +303,11 @@ print("${endTag}") |
326 | 303 | return () => { |
327 | 304 | observer.disconnect(); |
328 | 305 | document.removeEventListener('keydown', keydownHandler); |
| 306 | + // Must destroy EditorView so CodeMirror releases internal DOMObserver and DOM refs |
| 307 | + if (codeEditor) { |
| 308 | + codeEditor.destroy(); |
| 309 | + codeEditor = null; |
| 310 | + } |
329 | 311 | }; |
330 | 312 | }); |
331 | 313 |
|
|
0 commit comments