- naming/engine: lexer/parser/AST/render for {{ }} / if-elif-else / whitelisted filters
(default pad pad2 upper lower trim replace truncate date join); rejects for/set/attribute/
subscript/call/~/% with line:col errors and 'did you mean' hints
- naming/variables: variable table aligned with MoviePilot names plus ours (cut, airDate,
issue, slotName, libraryRoot ...); buildNamingVars from parsed release + entity + units
- naming/layout: split by literal '/', segment roles (category/root/season/sub/file),
value escaping, reserved names, 255-byte segments, validateNamingTemplate
- naming/defaults: MP default movie/tv + our variety template, v1 syntax upgrade,
entity > root > global override resolution, builtin preview samples
- path/binding: resolveTargetDirectory keeps bound dirs, only unbound segments render;
renderMediaFileName = last segment of the full template; DEFAULT_TEMPLATES = MP v2
- differential: 34 cases vs MP (21 identical, 13 documented deviations)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
14 lines
721 B
TypeScript
14 lines
721 B
TypeScript
import { buildNamingVars, type NamingEntityInput } from "../naming/variables.ts";
|
|
import type { ParsedRelease } from "../release-parser/types.ts";
|
|
|
|
// 命名上下文入口(兼容旧调用点):新引擎见 ../naming/**;v1 `{var}`/`[[ ]]` 语法已由
|
|
// naming/defaults.ts 的 upgradeLegacyTemplate 一次性迁移,不再单独解析。
|
|
|
|
/** 渲染上下文:MP 变量名 → 值(空值不出现) */
|
|
export type NamingContext = Record<string, string | number>;
|
|
|
|
/** 由作品信息 + 解析结果构造命名上下文(标题用本地实体名,不用发布标题) */
|
|
export function buildNamingContext(entity: NamingEntityInput, parsed?: Partial<ParsedRelease>): NamingContext {
|
|
return buildNamingVars(entity, parsed);
|
|
}
|