| 1 | import { createPromptCatalog } from '../catalog' |
| 2 | |
| 3 | import styleImageImportTemplate from '../templates/style-import/image.md?raw' |
| 4 | import stylePreviewTemplate from '../templates/style-import/preview.md?raw' |
| 5 | |
| 6 | type StaticStylePromptTemplateVars = { |
| 7 | 'image-import': {} |
| 8 | preview: {} |
| 9 | } |
| 10 | |
| 11 | const staticStylePromptCatalog = createPromptCatalog<StaticStylePromptTemplateVars>({ |
| 12 | 'image-import': styleImageImportTemplate.trimEnd(), |
| 13 | preview: stylePreviewTemplate.trimEnd() |
| 14 | }) |
| 15 | |
| 16 | const CATEGORY_GUIDE = [ |
| 17 | { zh: '浅色 · 沉静', en: 'light-calm' }, |
| 18 | { zh: '深色 · 沉稳', en: 'dark-steady' }, |
| 19 | { zh: '大胆 · 宣言', en: 'bold-statement' }, |
| 20 | { zh: '自然 · 有机', en: 'natural-organic' }, |
| 21 | { zh: '活力 · 创意', en: 'vibrant-creative' }, |
| 22 | { zh: '自定义', en: 'custom' } |
| 23 | ] |
| 24 | |
| 25 | const buildCategoryTable = (): string => |
| 26 | CATEGORY_GUIDE.map((item) => `- ${item.zh} => ${item.en}`).join('\n') |
| 27 | |
| 28 | export const buildStyleImageImportPrompt = (): string => |
| 29 | staticStylePromptCatalog.render('image-import', {}) |
| 30 | |
| 31 | export const buildStyleImportPrompt = (virtualPath: string): string => { |
| 32 | const categoryTable = buildCategoryTable() |
| 33 | return [ |
| 34 | '你是一个 PPT 风格解析专家。用户会提供一段描述 PPT 风格的文本(可能是 Markdown、纯文本、HTML 片段、或其他工具的风格描述)。', |
| 35 | '你必须先使用 read_file 读取文件,再进行解析。', |
| 36 | '请将其解析为严格 JSON,且只返回 JSON,不要返回额外说明。', |
| 37 | '', |
| 38 | '输出结构:', |
| 39 | '{', |
| 40 | ' "label": "风格显示名,如 暗夜科技",', |
| 41 | ' "description": "一句话描述风格特征,20 字以内",', |
| 42 | ' "category": "分类标签(必须从给定中文枚举中选一个)",', |
| 43 | ' "aliases": ["搜索别名1", "别名2"],', |
| 44 | ' "styleCase": "适用场景,列出 3-4 个典型用例,用顿号分隔,如:技术分享、开发者社区 Meetup、编程教学、黑客马拉松",', |
| 45 | ' "styleSkill": "完整的 Markdown 风格技能文本"', |
| 46 | '}', |
| 47 | '', |
| 48 | 'category 映射:', |
| 49 | categoryTable, |
| 50 | '', |
| 51 | 'styleSkill 撰写要求:', |
| 52 | 'styleSkill 是面向 AI 生成模型的风格指令,要具体、生动、有灵魂,让模型读完能精准复刻。', |
| 53 | '不要写成冷冰冰的规范文档,要像有品味的设计师在描述"这次要做什么感觉的东西"。', |
| 54 | '', |
| 55 | '用 Markdown 格式,开头一段话总括整体气质,然后用 ## 分 section 描述各维度。每个 section 内部用自然语言描述,配色融入情感描述(如"温暖的浅蓝"),插画列举具体意象(纸船、雨伞),字体描述传达感觉(手写风、圆润亲切)。', |
| 56 | '配色描述要同时包含情绪/质感与可执行的具体色值,主色、背景色、正文色、强调色建议尽量给出 hex。', |
| 57 | '', |
| 58 | '参考示例:', |
| 59 | '注意:示例只展示写法和结构,不得复制示例中的颜色、意象、字体、场景或适用领域;必须以输入文件的真实内容为准。', |
| 60 | '---', |
| 61 | '采用手绘水彩绘本风格,整体以低饱和暖色与海洋系浅蓝为主,营造治愈、温柔、富有故事感的视觉氛围。', |
| 62 | '', |
| 63 | '## 配色', |
| 64 | '主色包含天蓝 #87CEEB、湖蓝、米白 #F5F5DC、浅卡其、暖黄色与橘粉色,辅以淡灰蓝、浅棕和少量珊瑚红 #FF7F50 作点缀。背景多为大面积留白或纸张质感的浅米色底。', |
| 65 | '', |
| 66 | '## 排版', |
| 67 | '标题使用较粗的毛笔/手写风字体,黑色或深棕色,高辨识度且富有情绪;副标题与正文则采用较细的手写字或简洁印刷体,字号层级清晰,整体不强调严肃规范而更注重陪伴感与可读性。', |
| 68 | '', |
| 69 | '## 插画与装饰', |
| 70 | '设计元素以彩铅+水彩晕染插画为核心,如海浪、太阳、纸船、雨伞、云朵、天气图标、丝带横幅、手绘边框和轻微纹理底色,图形轮廓柔和自然,带有儿童绘本式的不规则感。', |
| 71 | '', |
| 72 | '## 布局', |
| 73 | '偏向上下分区或模块化排布,上方常用大幅场景插画营造情绪,中部放置醒目主标题和副标题,下方结合卡片宫格与说明文字进行信息组织。留白充足,元素之间呼吸感明显。', |
| 74 | '', |
| 75 | '## 动画', |
| 76 | '节奏舒缓,元素入场使用 ease-out 缓动,时长 0.8s–1.2s。插画元素可做轻微浮动或摇摆,文字淡入或从下方轻滑入。', |
| 77 | '', |
| 78 | '## 适合场景', |
| 79 | '适合制作面向青少年、心理成长、教育科普类的温暖型 PPT。', |
| 80 | '', |
| 81 | '## 不要', |
| 82 | '- 不要使用高饱和、刺眼的颜色', |
| 83 | '- 不要使用尖锐的几何图形或硬朗的线条', |
| 84 | '- 不要使用复杂的渐变或强烈的阴影效果', |
| 85 | '- 不要让布局过于拥挤,保持充足的呼吸感', |
| 86 | '---', |
| 87 | '', |
| 88 | '规则:', |
| 89 | '1. 如果用户文本中有明确颜色值,优先使用。', |
| 90 | '2. 如果字段缺失,根据风格语义补充合理默认值。', |
| 91 | '3. category 字段必须输出中文枚举值;styleSkill 中的分类必须输出对应英文标识。', |
| 92 | '4. 只输出 JSON,且使用 ```json ... ``` 包裹。', |
| 93 | '5. 如果文件较长,分段多次 read_file 后再总结,不要只读取开头。', |
| 94 | '', |
| 95 | `读取文件路径:${virtualPath}` |
| 96 | ].join('\n') |
| 97 | } |
| 98 | |
| 99 | export function buildStylePptxImportPrompt(args: { |
| 100 | deckRootPath: string |
| 101 | indexPath: string |
| 102 | samplePagePaths: string[] |
| 103 | }): string { |
| 104 | const categoryTable = buildCategoryTable() |
| 105 | const sampleList = args.samplePagePaths.map((item) => `- ${item}`).join('\n') |
| 106 | return [ |
| 107 | '你是 PPT 视觉风格解析专家。现在你拿到的是由 PPTX 转换得到的 HTML 页面目录。', |
| 108 | '你必须先 grep,再 read_file,最后再输出 JSON。', |
| 109 | '', |
| 110 | '工作步骤(必须按顺序):', |
| 111 | '1. 先用 grep 在整个目录检索样式线索:color/background/font-family/gradient。', |
| 112 | '2. 再用 read_file 精读以下关键文件:index.html + 指定抽样页。', |
| 113 | '3. 综合提取配色、字体、布局比例、视觉氛围,生成标准风格 JSON。', |
| 114 | '', |
| 115 | '读取根目录:', |
| 116 | args.deckRootPath, |
| 117 | '', |
| 118 | '必须精读文件:', |
| 119 | `- ${args.indexPath}`, |
| 120 | sampleList || '- 无', |
| 121 | '', |
| 122 | '输出结构:', |
| 123 | '{', |
| 124 | ' "label": "风格显示名,如 暗夜科技",', |
| 125 | ' "description": "一句话描述风格特征,20 字以内",', |
| 126 | ' "category": "分类标签(必须从给定中文枚举中选一个)",', |
| 127 | ' "aliases": ["搜索别名1", "别名2"],', |
| 128 | ' "styleCase": "适用场景,列出 3-4 个典型用例,用顿号分隔,如:技术分享、开发者社区 Meetup、编程教学、黑客马拉松",', |
| 129 | ' "styleSkill": "完整的 Markdown 风格技能文本"', |
| 130 | '}', |
| 131 | '', |
| 132 | 'category 映射:', |
| 133 | categoryTable, |
| 134 | '', |
| 135 | 'styleSkill 撰写要求:', |
| 136 | 'styleSkill 是面向 AI 生成模型的风格指令,要具体、生动、有灵魂,让模型读完能精准复刻。', |
| 137 | '不要写成冷冰冰的规范文档,要像有品味的设计师在描述"这次要做什么感觉的东西"。', |
| 138 | '', |
| 139 | '用 Markdown 格式,开头一段话总括整体气质,然后用 ## 分 section 描述各维度。每个 section 内部用自然语言描述,配色融入情感描述(如"温暖的浅蓝"),插画列举具体意象(纸船、雨伞),字体描述传达感觉(手写风、圆润亲切)。', |
| 140 | '配色描述要同时包含情绪/质感与可执行的具体色值,主色、背景色、正文色、强调色建议尽量给出 hex。', |
| 141 | '', |
| 142 | '参考示例:', |
| 143 | '注意:示例只展示写法和结构,不得复制示例中的颜色、意象、字体、场景或适用领域;必须以导入 PPTX 的真实视觉为准。', |
| 144 | '---', |
| 145 | '采用手绘水彩绘本风格,整体以低饱和暖色与海洋系浅蓝为主,营造治愈、温柔、富有故事感的视觉氛围。', |
| 146 | '', |
| 147 | '## 配色', |
| 148 | '主色包含天蓝 #87CEEB、湖蓝、米白 #F5F5DC、浅卡其、暖黄色与橘粉色,辅以淡灰蓝、浅棕和少量珊瑚红 #FF7F50 作点缀。背景多为大面积留白或纸张质感的浅米色底。', |
| 149 | '', |
| 150 | '## 排版', |
| 151 | '标题使用较粗的毛笔/手写风字体,黑色或深棕色,高辨识度且富有情绪;副标题与正文则采用较细的手写字或简洁印刷体,字号层级清晰,整体不强调严肃规范而更注重陪伴感与可读性。', |
| 152 | '', |
| 153 | '## 插画与装饰', |
| 154 | '设计元素以彩铅+水彩晕染插画为核心,如海浪、太阳、纸船、雨伞、云朵、天气图标、丝带横幅、手绘边框和轻微纹理底色,图形轮廓柔和自然,带有儿童绘本式的不规则感。', |
| 155 | '', |
| 156 | '## 布局', |
| 157 | '偏向上下分区或模块化排布,上方常用大幅场景插画营造情绪,中部放置醒目主标题和副标题,下方结合卡片宫格与说明文字进行信息组织。留白充足,元素之间呼吸感明显。', |
| 158 | '', |
| 159 | '## 动画', |
| 160 | '节奏舒缓,元素入场使用 ease-out 缓动,时长 0.8s–1.2s。插画元素可做轻微浮动或摇摆,文字淡入或从下方轻滑入。', |
| 161 | '', |
| 162 | '## 适合场景', |
| 163 | '适合制作面向青少年、心理成长、教育科普类的温暖型 PPT。', |
| 164 | '', |
| 165 | '## 不要', |
| 166 | '- 不要使用高饱和、刺眼的颜色', |
| 167 | '- 不要使用尖锐的几何图形或硬朗的线条', |
| 168 | '- 不要使用复杂的渐变或强烈的阴影效果', |
| 169 | '- 不要让布局过于拥挤,保持充足的呼吸感', |
| 170 | '---', |
| 171 | '', |
| 172 | '规则:', |
| 173 | '1. 优先使用 grep/read_file 中出现的真实颜色和字体。', |
| 174 | '2. 如果字段缺失,可根据整体视觉语义做合理补全。', |
| 175 | '3. category 字段必须输出中文枚举值;styleSkill 中的分类必须输出对应英文标识。', |
| 176 | '4. 只输出 JSON,且使用 ```json ... ``` 包裹。', |
| 177 | '5. 不要输出任何解释性文字。' |
| 178 | ].join('\n') |
| 179 | } |
| 180 | |
| 181 | export const buildStylePreviewPrompt = (): string => staticStylePromptCatalog.render('preview', {}) |
| 182 |