mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 08:46:37 -04:00
Speed up editor by lazily loading CodeMirror (#1766)
This commit is contained in:
parent
04f508d664
commit
0db921dd39
3 changed files with 28 additions and 7 deletions
|
@ -30,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
export let configuration: CodeMirrorLib.EditorConfiguration;
|
export let configuration: CodeMirrorLib.EditorConfiguration;
|
||||||
export let code: Writable<string>;
|
export let code: Writable<string>;
|
||||||
|
export let hidden = false;
|
||||||
|
|
||||||
const defaultConfiguration = {
|
const defaultConfiguration = {
|
||||||
rtlMoveVisually: true,
|
rtlMoveVisually: true,
|
||||||
|
@ -79,6 +80,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
use:openCodeMirror={{
|
use:openCodeMirror={{
|
||||||
configuration: { ...configuration, ...defaultConfiguration },
|
configuration: { ...configuration, ...defaultConfiguration },
|
||||||
resolve,
|
resolve,
|
||||||
|
hidden,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -63,24 +63,37 @@ export function focusAndSetCaret(
|
||||||
interface OpenCodeMirrorOptions {
|
interface OpenCodeMirrorOptions {
|
||||||
configuration: CodeMirror.EditorConfiguration;
|
configuration: CodeMirror.EditorConfiguration;
|
||||||
resolve(editor: CodeMirror.EditorFromTextArea): void;
|
resolve(editor: CodeMirror.EditorFromTextArea): void;
|
||||||
|
hidden: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function openCodeMirror(
|
export function openCodeMirror(
|
||||||
textarea: HTMLTextAreaElement,
|
textarea: HTMLTextAreaElement,
|
||||||
{ configuration, resolve }: Partial<OpenCodeMirrorOptions>,
|
options: Partial<OpenCodeMirrorOptions>,
|
||||||
): { update: (options: Partial<OpenCodeMirrorOptions>) => void; destroy: () => void } {
|
): { update: (options: Partial<OpenCodeMirrorOptions>) => void; destroy: () => void } {
|
||||||
const editor = CodeMirror.fromTextArea(textarea, configuration);
|
let editor: CodeMirror.EditorFromTextArea;
|
||||||
resolve?.(editor);
|
|
||||||
|
|
||||||
return {
|
function update({
|
||||||
update({ configuration }: Partial<OpenCodeMirrorOptions>): void {
|
configuration,
|
||||||
|
resolve,
|
||||||
|
hidden,
|
||||||
|
}: Partial<OpenCodeMirrorOptions>): void {
|
||||||
|
if (editor) {
|
||||||
for (const key in configuration) {
|
for (const key in configuration) {
|
||||||
editor.setOption(
|
editor.setOption(
|
||||||
key as keyof CodeMirror.EditorConfiguration,
|
key as keyof CodeMirror.EditorConfiguration,
|
||||||
configuration[key],
|
configuration[key],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
} else if (!hidden) {
|
||||||
|
editor = CodeMirror.fromTextArea(textarea, configuration);
|
||||||
|
resolve?.(editor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
update(options);
|
||||||
|
|
||||||
|
return {
|
||||||
|
update,
|
||||||
destroy(): void {
|
destroy(): void {
|
||||||
editor.toTextArea();
|
editor.toTextArea();
|
||||||
},
|
},
|
||||||
|
|
|
@ -136,7 +136,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
class:hidden
|
class:hidden
|
||||||
on:focusin={() => ($focusedInput = api)}
|
on:focusin={() => ($focusedInput = api)}
|
||||||
>
|
>
|
||||||
<CodeMirror {configuration} {code} bind:api={codeMirror} on:change={onChange} />
|
<CodeMirror
|
||||||
|
{configuration}
|
||||||
|
{code}
|
||||||
|
{hidden}
|
||||||
|
bind:api={codeMirror}
|
||||||
|
on:change={onChange}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
Loading…
Reference in a new issue