Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 | import type { FormatKeys } from './type' import { styles } from './styles' /** * 递归应用 ANSI 转义序列的核心函数 * @param formats - 待应用的样式数组 * @param text - 当前层级的文本 * @returns 嵌套应用样式的字符串 * @deprecated 使用数组的 reduce 更简洁 */ // eslint-disable-next-line unused-imports/no-unused-vars function applyStylesRecursive(formats: FormatKeys[], text: string): string { // 终止条件:所有样式应用完成 if (formats.length === 0) return text // 取出当前层级的样式(保持应用顺序) const [currentFormat, ...remainingFormats] = formats // 类型安全校验 const style = currentFormat && styles[currentFormat] if (!style) { throw new Error(`Invalid style format: ${currentFormat}`) } // 递归应用后续样式 const innerText = applyStylesRecursive(remainingFormats, text) // 包裹当前层级的样式 return `${style.open}${innerText}${style.close}` } /** * 给文本添加 ANSI 转义序列样式(递归版本) * @param format - 单个样式或样式数组 * @param text - 需要格式化的文本 * @returns 带有 ANSI 转义序列的格式化文本 */ export function styleText(format: FormatKeys | FormatKeys[], text: string): string { const formats = Array.isArray(format) ? format : [format] /** * 颜色样式的表现结果是就近原则的, * 所以这里需要对数组逆序一下, * 以保证后续的样式设置的权重更高 * 但是如果是使用递归的做法,由于递归本身存在反向的特点,所以不用逆向数组 */ return formats.reverse() .reduce((str, style) => `${styles[style].open}${str}${styles[style].close}`, text) } export * from './common' export * from './constants' export * from './styles' export type * from './type' |