-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathsummaryTiers.js
More file actions
133 lines (113 loc) · 3.76 KB
/
Copy pathsummaryTiers.js
File metadata and controls
133 lines (113 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (C) 2024–2026 Aiko Hanasaki
// SPDX-License-Identifier: AGPL-3.0-only
export const MIN_SUMMARY_CHILDREN = 1;
const DEFAULT_MIN_CHILDREN = 5;
export const STMB_SUMMARY_TIERS = [
{ tier: 0, key: "memory", label: "Memory" },
{ tier: 1, key: "arc", label: "Arc" },
{ tier: 2, key: "chapter", label: "Chapter" },
{ tier: 3, key: "book", label: "Book" },
{ tier: 4, key: "legend", label: "Legend" },
{ tier: 5, key: "series", label: "Series" },
{ tier: 6, key: "epic", label: "Epic" },
];
const TIER_MAP = new Map(STMB_SUMMARY_TIERS.map((cfg) => [cfg.tier, cfg]));
function normalizeTier(tier) {
const num = Number(tier);
return Number.isFinite(num) ? Math.trunc(num) : 0;
}
export function getSummaryTierConfig(tier) {
const normalizedTier = normalizeTier(tier);
if (TIER_MAP.has(normalizedTier)) {
return TIER_MAP.get(normalizedTier);
}
return {
tier: normalizedTier,
key: `tier${normalizedTier}`,
label: `Tier ${normalizedTier}`,
};
}
export function getSummaryTierLabel(tier) {
return getSummaryTierConfig(tier).label;
}
export function getSummaryTypeKey(tier) {
return getSummaryTierConfig(tier).key;
}
export function getSourceTierForTarget(targetTier) {
return Math.max(0, normalizeTier(targetTier) - 1);
}
export function getDefaultSummaryTitleFormat(tier) {
const cfg = getSummaryTierConfig(tier);
if (cfg.tier <= 0) return "[000] - {{title}}";
return `[${String(cfg.key || "tier").toUpperCase()} 000] - {{title}}`;
}
export function getDefaultSummaryMinChildren(tier) {
return normalizeTier(tier) <= 0 ? 0 : DEFAULT_MIN_CHILDREN;
}
export function normalizeSummaryMinChildren(value, fallback = DEFAULT_MIN_CHILDREN) {
const parsedValue = Number(value);
if (Number.isFinite(parsedValue)) {
return Math.max(MIN_SUMMARY_CHILDREN, Math.trunc(parsedValue));
}
const parsedFallback = Number(fallback);
if (Number.isFinite(parsedFallback)) {
return Math.max(MIN_SUMMARY_CHILDREN, Math.trunc(parsedFallback));
}
return DEFAULT_MIN_CHILDREN;
}
export function isSummaryEntry(entry) {
return !!entry && entry.stmbSummary === true;
}
export function getEntrySummaryTier(entry) {
if (!entry || typeof entry !== "object") return 0;
if (entry.stmbSummary === true) {
const tier = normalizeTier(entry.stmbSummaryTier);
return tier > 0 ? tier : 1;
}
if (entry.stmbArc === true || String(entry.type || "").toLowerCase() === "arc") {
return 1;
}
return 0;
}
export function isEligibleSummarySourceEntry(entry, sourceTier) {
if (!entry || typeof entry !== "object") return false;
if (entry.stmemorybooks !== true) return false;
if (entry.disable) return false;
return getEntrySummaryTier(entry) === normalizeTier(sourceTier);
}
export function migrateLorebookSummarySchema(lorebookData) {
const entries = Object.values(lorebookData?.entries || {});
let changed = false;
for (const entry of entries) {
if (!entry || typeof entry !== "object") continue;
const isLegacyArc =
entry.stmbArc === true || String(entry.type || "").toLowerCase() === "arc";
if (isLegacyArc) {
if (entry.stmbSummary !== true) {
entry.stmbSummary = true;
changed = true;
}
if (normalizeTier(entry.stmbSummaryTier) !== 1) {
entry.stmbSummaryTier = 1;
changed = true;
}
if (entry.type !== "arc") {
entry.type = "arc";
changed = true;
}
}
if (entry.disabledByArcId !== undefined && entry.disabledBySummaryId === undefined) {
entry.disabledBySummaryId = entry.disabledByArcId ?? null;
changed = true;
}
if ("stmbArc" in entry) {
delete entry.stmbArc;
changed = true;
}
if ("disabledByArcId" in entry) {
delete entry.disabledByArcId;
changed = true;
}
}
return changed;
}