refactor: extract shortcut config resolution utility

This commit is contained in:
2026-02-09 20:02:06 -08:00
parent 1aa0e410ec
commit a25c39dd22
2 changed files with 84 additions and 60 deletions

View File

@@ -0,0 +1,82 @@
import { Config } from "../../types";
export interface ConfiguredShortcuts {
toggleVisibleOverlayGlobal: string | null | undefined;
toggleInvisibleOverlayGlobal: string | null | undefined;
copySubtitle: string | null | undefined;
copySubtitleMultiple: string | null | undefined;
updateLastCardFromClipboard: string | null | undefined;
triggerFieldGrouping: string | null | undefined;
triggerSubsync: string | null | undefined;
mineSentence: string | null | undefined;
mineSentenceMultiple: string | null | undefined;
multiCopyTimeoutMs: number;
toggleSecondarySub: string | null | undefined;
markAudioCard: string | null | undefined;
openRuntimeOptions: string | null | undefined;
}
export function resolveConfiguredShortcuts(
config: Config,
defaultConfig: Config,
): ConfiguredShortcuts {
const normalizeShortcut = (
value: string | null | undefined,
): string | null | undefined => {
if (typeof value !== "string") return value;
return value
.replace(/\bKey([A-Z])\b/g, "$1")
.replace(/\bDigit([0-9])\b/g, "$1");
};
return {
toggleVisibleOverlayGlobal: normalizeShortcut(
config.shortcuts?.toggleVisibleOverlayGlobal ??
defaultConfig.shortcuts?.toggleVisibleOverlayGlobal,
),
toggleInvisibleOverlayGlobal: normalizeShortcut(
config.shortcuts?.toggleInvisibleOverlayGlobal ??
defaultConfig.shortcuts?.toggleInvisibleOverlayGlobal,
),
copySubtitle: normalizeShortcut(
config.shortcuts?.copySubtitle ?? defaultConfig.shortcuts?.copySubtitle,
),
copySubtitleMultiple: normalizeShortcut(
config.shortcuts?.copySubtitleMultiple ??
defaultConfig.shortcuts?.copySubtitleMultiple,
),
updateLastCardFromClipboard: normalizeShortcut(
config.shortcuts?.updateLastCardFromClipboard ??
defaultConfig.shortcuts?.updateLastCardFromClipboard,
),
triggerFieldGrouping: normalizeShortcut(
config.shortcuts?.triggerFieldGrouping ??
defaultConfig.shortcuts?.triggerFieldGrouping,
),
triggerSubsync: normalizeShortcut(
config.shortcuts?.triggerSubsync ?? defaultConfig.shortcuts?.triggerSubsync,
),
mineSentence: normalizeShortcut(
config.shortcuts?.mineSentence ?? defaultConfig.shortcuts?.mineSentence,
),
mineSentenceMultiple: normalizeShortcut(
config.shortcuts?.mineSentenceMultiple ??
defaultConfig.shortcuts?.mineSentenceMultiple,
),
multiCopyTimeoutMs:
config.shortcuts?.multiCopyTimeoutMs ??
defaultConfig.shortcuts?.multiCopyTimeoutMs ??
5000,
toggleSecondarySub: normalizeShortcut(
config.shortcuts?.toggleSecondarySub ??
defaultConfig.shortcuts?.toggleSecondarySub,
),
markAudioCard: normalizeShortcut(
config.shortcuts?.markAudioCard ?? defaultConfig.shortcuts?.markAudioCard,
),
openRuntimeOptions: normalizeShortcut(
config.shortcuts?.openRuntimeOptions ??
defaultConfig.shortcuts?.openRuntimeOptions,
),
};
}

View File

@@ -124,6 +124,7 @@ import {
} from "./core/utils/electron-backend";
import { asBoolean, asFiniteNumber, asString } from "./core/utils/coerce";
import { resolveKeybindings } from "./core/utils/keybindings";
import { resolveConfiguredShortcuts } from "./core/utils/shortcut-config";
import { TexthookerService } from "./core/services/texthooker-service";
import {
hasMpvWebsocketPlugin,
@@ -2347,66 +2348,7 @@ function registerGlobalShortcuts(): void {
}
function getConfiguredShortcuts() {
const config = getResolvedConfig();
const normalizeShortcut = (
value: string | null | undefined,
): string | null | undefined => {
if (typeof value !== "string") return value;
return value
.replace(/\bKey([A-Z])\b/g, "$1")
.replace(/\bDigit([0-9])\b/g, "$1");
};
return {
toggleVisibleOverlayGlobal: normalizeShortcut(
config.shortcuts?.toggleVisibleOverlayGlobal ??
DEFAULT_CONFIG.shortcuts.toggleVisibleOverlayGlobal,
),
toggleInvisibleOverlayGlobal: normalizeShortcut(
config.shortcuts?.toggleInvisibleOverlayGlobal ??
DEFAULT_CONFIG.shortcuts.toggleInvisibleOverlayGlobal,
),
copySubtitle: normalizeShortcut(
config.shortcuts?.copySubtitle ?? DEFAULT_CONFIG.shortcuts.copySubtitle,
),
copySubtitleMultiple: normalizeShortcut(
config.shortcuts?.copySubtitleMultiple ??
DEFAULT_CONFIG.shortcuts.copySubtitleMultiple,
),
updateLastCardFromClipboard: normalizeShortcut(
config.shortcuts?.updateLastCardFromClipboard ??
DEFAULT_CONFIG.shortcuts.updateLastCardFromClipboard,
),
triggerFieldGrouping: normalizeShortcut(
config.shortcuts?.triggerFieldGrouping ??
DEFAULT_CONFIG.shortcuts.triggerFieldGrouping,
),
triggerSubsync: normalizeShortcut(
config.shortcuts?.triggerSubsync ??
DEFAULT_CONFIG.shortcuts.triggerSubsync,
),
mineSentence: normalizeShortcut(
config.shortcuts?.mineSentence ?? DEFAULT_CONFIG.shortcuts.mineSentence,
),
mineSentenceMultiple: normalizeShortcut(
config.shortcuts?.mineSentenceMultiple ??
DEFAULT_CONFIG.shortcuts.mineSentenceMultiple,
),
multiCopyTimeoutMs:
config.shortcuts?.multiCopyTimeoutMs ??
DEFAULT_CONFIG.shortcuts.multiCopyTimeoutMs,
toggleSecondarySub: normalizeShortcut(
config.shortcuts?.toggleSecondarySub ??
DEFAULT_CONFIG.shortcuts.toggleSecondarySub,
),
markAudioCard: normalizeShortcut(
config.shortcuts?.markAudioCard ?? DEFAULT_CONFIG.shortcuts.markAudioCard,
),
openRuntimeOptions: normalizeShortcut(
config.shortcuts?.openRuntimeOptions ??
DEFAULT_CONFIG.shortcuts.openRuntimeOptions,
),
};
return resolveConfiguredShortcuts(getResolvedConfig(), DEFAULT_CONFIG);
}
function tryHandleOverlayShortcutLocalFallback(input: Electron.Input): boolean {