summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/code-highlighter.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/scripts/code-highlighter.ts')
-rw-r--r--packages/frontend/src/scripts/code-highlighter.ts97
1 files changed, 0 insertions, 97 deletions
diff --git a/packages/frontend/src/scripts/code-highlighter.ts b/packages/frontend/src/scripts/code-highlighter.ts
deleted file mode 100644
index 4d57dcd944..0000000000
--- a/packages/frontend/src/scripts/code-highlighter.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { createHighlighterCore } from 'shiki/core';
-import { createOnigurumaEngine } from 'shiki/engine/oniguruma';
-import darkPlus from 'shiki/themes/dark-plus.mjs';
-import { bundledThemesInfo } from 'shiki/themes';
-import { bundledLanguagesInfo } from 'shiki/langs';
-import lightTheme from '@@/themes/_light.json5';
-import darkTheme from '@@/themes/_dark.json5';
-import { unique } from './array.js';
-import { deepClone } from './clone.js';
-import { deepMerge } from './merge.js';
-import type { HighlighterCore, LanguageRegistration, ThemeRegistration, ThemeRegistrationRaw } from 'shiki/core';
-import { ColdDeviceStorage } from '@/store.js';
-
-let _highlighter: HighlighterCore | null = null;
-
-export async function getTheme(mode: 'light' | 'dark', getName: true): Promise<string>;
-export async function getTheme(mode: 'light' | 'dark', getName?: false): Promise<ThemeRegistration | ThemeRegistrationRaw>;
-export async function getTheme(mode: 'light' | 'dark', getName = false): Promise<ThemeRegistration | ThemeRegistrationRaw | string | null> {
- const theme = deepClone(ColdDeviceStorage.get(mode === 'light' ? 'lightTheme' : 'darkTheme'));
-
- if (theme.base) {
- const base = [lightTheme, darkTheme].find(x => x.id === theme.base);
- if (base && base.codeHighlighter) theme.codeHighlighter = Object.assign({}, base.codeHighlighter, theme.codeHighlighter);
- }
-
- if (theme.codeHighlighter) {
- let _res: ThemeRegistration = {};
- if (theme.codeHighlighter.base === '_none_') {
- _res = deepClone(theme.codeHighlighter.overrides);
- } else {
- const base = await bundledThemesInfo.find(t => t.id === theme.codeHighlighter!.base)?.import() ?? darkPlus;
- _res = deepMerge(theme.codeHighlighter.overrides ?? {}, 'default' in base ? base.default : base);
- }
- if (_res.name == null) {
- _res.name = theme.id;
- }
- _res.type = mode;
-
- if (getName) {
- return _res.name;
- }
- return _res;
- }
-
- if (getName) {
- return 'dark-plus';
- }
- return darkPlus;
-}
-
-export async function getHighlighter(): Promise<HighlighterCore> {
- if (!_highlighter) {
- return await initHighlighter();
- }
- return _highlighter;
-}
-
-async function initHighlighter() {
- // テーマの重複を消す
- const themes = unique([
- darkPlus,
- ...(await Promise.all([getTheme('light'), getTheme('dark')])),
- ]);
-
- const jsLangInfo = bundledLanguagesInfo.find(t => t.id === 'javascript');
- const highlighter = await createHighlighterCore({
- engine: createOnigurumaEngine(() => import('shiki/onig.wasm?init')),
- themes,
- langs: [
- ...(jsLangInfo ? [async () => await jsLangInfo.import()] : []),
- async () => (await import('aiscript-vscode/aiscript/syntaxes/aiscript.tmLanguage.json')).default as unknown as LanguageRegistration,
- ],
- });
-
- ColdDeviceStorage.watch('lightTheme', async () => {
- const newTheme = await getTheme('light');
- if (newTheme.name && !highlighter.getLoadedThemes().includes(newTheme.name)) {
- highlighter.loadTheme(newTheme);
- }
- });
-
- ColdDeviceStorage.watch('darkTheme', async () => {
- const newTheme = await getTheme('dark');
- if (newTheme.name && !highlighter.getLoadedThemes().includes(newTheme.name)) {
- highlighter.loadTheme(newTheme);
- }
- });
-
- _highlighter = highlighter;
-
- return highlighter;
-}