import { GENERATION_POEM_STATUS } from '@/services/api/generation-poem-contract.js' export { GENERATION_POEM_STATUS } // 三个限制逐一对应 GenerationPoemBatchBody:输入总长 26000、单代文字 // 最多 50 字符、单批最多 500 个世代,不能再合并成一个含义模糊的“长度”。 export const MAX_GENERATION_COUNT = 500 export const MAX_GENERATION_TEXT_LENGTH = 50 export const MAX_GENERATION_POEM_INPUT_LENGTH = 26000 const separatorPattern = /[\s,,;;、/|]/u const separatorRunPattern = /[\s,,;;、/|]+/u const forbiddenControlPattern = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/u const codePointLength = (value) => Array.from(value).length const normalizeGenerationText = (value) => { const text = String(value ?? '').trim() if ( !text || codePointLength(text) > MAX_GENERATION_TEXT_LENGTH || forbiddenControlPattern.test(text) ) { return null } return text } // 按 OpenAPI 的批量输入规则解析:没有分隔符时每个 Unicode code point 对应 // 一代;存在空格、逗号、分号、顿号、斜杠或竖线时,每个分段可包含多字。 export const validateGenerationPoemText = (value) => { const input = String(value ?? '') if (!input.trim()) { return Object.freeze({ valid: false, generations: [], message: '请录入字辈内容' }) } if (codePointLength(input) > MAX_GENERATION_POEM_INPUT_LENGTH) { return Object.freeze({ valid: false, generations: [], message: `字辈输入最多 ${MAX_GENERATION_POEM_INPUT_LENGTH} 个字符`, }) } if (forbiddenControlPattern.test(input)) { return Object.freeze({ valid: false, generations: [], message: '字辈内容包含不支持的控制字符', }) } const generations = separatorPattern.test(input) ? input.split(separatorRunPattern).map((item) => item.trim()).filter(Boolean) : Array.from(input) if (!generations.length) { return Object.freeze({ valid: false, generations, message: '请录入字辈内容' }) } if (generations.length > MAX_GENERATION_COUNT) { return Object.freeze({ valid: false, generations, message: `一次最多录入 ${MAX_GENERATION_COUNT} 个世代`, }) } if (generations.some((item) => normalizeGenerationText(item) === null)) { return Object.freeze({ valid: false, generations, message: `每代字辈文字不能为空且最多 ${MAX_GENERATION_TEXT_LENGTH} 个字符`, }) } return Object.freeze({ valid: true, generations, message: '' }) }