返回 oh-my-ppt
style-import.ts
根目录 / src / main / agent-runtime / prompt / composers / style-import.ts
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
182 lines TYPESCRIPT