panatgithub_AnkiHeadingSync/src/domain/manual-sync/services/DeckResolutionService.ts
Dusk 488bd3d91f feat(deck): add folder-level deck mode overrides
在 include 模式下允许选中文件夹改用与全局 folderDeckMode 相反的映射规则

Add include-scope folder overrides that apply the opposite global folderDeckMode mapping

取消勾选文件夹时会清理该路径及其子树的覆盖记录,并把规则接入设置页与 deck fingerprint

Clears override records for deselected folders and descendants, and wires the rules into the settings UI and deck fingerprint
2026-04-30 19:18:15 +08:00

55 lines
No EOL
1.7 KiB
TypeScript

import type { PluginSettings } from "@/application/config/PluginSettings";
import type { IndexedCard } from "@/domain/manual-sync/entities/IndexedCard";
import type { DeckResolutionResult } from "@/domain/manual-sync/value-objects/DeckResolution";
import { DeckNormalizationService } from "./DeckNormalizationService";
import { FolderDeckMappingService } from "./FolderDeckMappingService";
export class DeckResolutionService {
constructor(
private readonly folderDeckMappingService = new FolderDeckMappingService(),
private readonly deckNormalizationService = new DeckNormalizationService(),
) {}
resolve(card: IndexedCard, settings: Pick<PluginSettings, "defaultDeck" | "folderDeckMode" | "alternateFolderDeckModeFolders">): DeckResolutionResult {
if (card.deckHint) {
return {
resolvedDeck: {
value: this.deckNormalizationService.normalize(card.deckHint),
source: card.deckHintSource ?? "body",
},
warnings: [...card.deckWarnings],
};
}
const folderMapping = this.folderDeckMappingService.mapFilePathToDeck(
card.filePath,
settings.folderDeckMode,
settings.alternateFolderDeckModeFolders,
);
if (folderMapping.deck) {
return {
resolvedDeck: {
value: folderMapping.deck,
source: "folder",
},
warnings: [...card.deckWarnings, ...folderMapping.warnings],
};
}
return {
resolvedDeck: {
value: this.deckNormalizationService.normalize(settings.defaultDeck),
source: "default",
},
warnings: [
...card.deckWarnings,
...folderMapping.warnings,
{
filePath: card.filePath,
code: "deck_fallback_default",
},
],
};
}
}