@panda-agent/panda-cli 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/panda-cli-ink.bundle.mjs +267 -258
- package/package.json +6 -4
- package/skills/.gitkeep +0 -0
- package/skills/README.md +13 -0
- package/skills/docx/.skill-metadata.yaml +173 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +589 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/accept_changes.py +206 -0
- package/skills/docx/scripts/comment.py +442 -0
- package/skills/docx/scripts/office/helpers/__init__.py +1 -0
- package/skills/docx/scripts/office/helpers/merge_runs.py +190 -0
- package/skills/docx/scripts/office/helpers/simplify_redlines.py +185 -0
- package/skills/docx/scripts/office/pack.py +167 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/scripts/office/soffice.py +194 -0
- package/skills/docx/scripts/office/unpack.py +145 -0
- package/skills/docx/scripts/office/validate.py +114 -0
- package/skills/docx/scripts/office/validators/__init__.py +16 -0
- package/skills/docx/scripts/office/validators/base.py +733 -0
- package/skills/docx/scripts/office/validators/docx.py +354 -0
- package/skills/docx/scripts/office/validators/pptx.py +230 -0
- package/skills/docx/scripts/office/validators/redlining.py +212 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/pdf/.skill-metadata.yaml +273 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +324 -0
- package/skills/pdf/advanced-reference.md +609 -0
- package/skills/pdf/form-filling-guide.md +318 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +198 -0
- package/skills/pdf/scripts/check_fillable_fields.py +64 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +102 -0
- package/skills/pdf/scripts/create_validation_image.py +125 -0
- package/skills/pdf/scripts/extract_form_field_info.py +220 -0
- package/skills/pdf/scripts/extract_form_structure.py +202 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +205 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +193 -0
- package/skills/pptx-generator/SKILL.md +204 -0
- package/skills/pptx-generator/assets/styles/business.json +8 -0
- package/skills/pptx-generator/assets/styles/minimal.json +8 -0
- package/skills/pptx-generator/assets/styles/modern.json +8 -0
- package/skills/pptx-generator/assets/templates/ppt_data_template.json +40 -0
- package/skills/pptx-generator/references/collaboration_guide.md +381 -0
- package/skills/pptx-generator/references/json_format_spec.md +215 -0
- package/skills/pptx-generator/references/layout_guide.md +290 -0
- package/skills/pptx-generator/scripts/json_validator.py +194 -0
- package/skills/pptx-generator/scripts/pptx_builder.py +340 -0
- package/skills/pptx-generator/scripts/pptx_validator.py +162 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +479 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +248 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +332 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/xlsx/.skill-metadata.yaml +185 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +233 -0
- package/skills/xlsx/scripts/office/helpers/__init__.py +1 -0
- package/skills/xlsx/scripts/office/helpers/merge_runs.py +226 -0
- package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +198 -0
- package/skills/xlsx/scripts/office/pack.py +162 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/xlsx/scripts/office/soffice.py +185 -0
- package/skills/xlsx/scripts/office/unpack.py +146 -0
- package/skills/xlsx/scripts/office/validate.py +108 -0
- package/skills/xlsx/scripts/office/validators/__init__.py +13 -0
- package/skills/xlsx/scripts/office/validators/base.py +800 -0
- package/skills/xlsx/scripts/office/validators/docx.py +383 -0
- package/skills/xlsx/scripts/office/validators/pptx.py +250 -0
- package/skills/xlsx/scripts/office/validators/redlining.py +229 -0
- package/skills/xlsx/scripts/recalc.py +296 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# 布局指南
|
|
2
|
+
|
|
3
|
+
本文档详细说明了 pptx-generator 支持的各种布局类型及其使用场景。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
1. [布局概述](#布局概述)
|
|
7
|
+
2. [布局类型详解](#布局类型详解)
|
|
8
|
+
3. [布局选择建议](#布局选择建议)
|
|
9
|
+
4. [自定义布局](#自定义布局)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 布局概述
|
|
14
|
+
|
|
15
|
+
pptx-generator 支持多种预设布局类型,每种布局适用于不同的内容场景。
|
|
16
|
+
|
|
17
|
+
| 布局类型 | 标题位置 | 内容位置 | 适用场景 |
|
|
18
|
+
|----------|----------|----------|----------|
|
|
19
|
+
| TitleSlide | 顶部中央 | 下方列表 | 封面、标题页 |
|
|
20
|
+
| ContentSlide | 顶部 | 正文内容 | 标准内容页 |
|
|
21
|
+
| TwoColumnSlide | 顶部 | 两栏内容 | 对比、并列内容 |
|
|
22
|
+
| SectionHeaderSlide | 中央 | 无 | 章节页 |
|
|
23
|
+
| ContentWithCaptionSlide | 顶部 | 内容 + 说明 | 图片 + 文字 |
|
|
24
|
+
| SummarySlide | 顶部 | 总结内容 | 总结、结尾页 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 布局类型详解
|
|
29
|
+
|
|
30
|
+
### 1. TitleSlide (标题页)
|
|
31
|
+
|
|
32
|
+
**描述**:标题页布局,标题位于中央,内容作为副标题或要点展示。
|
|
33
|
+
|
|
34
|
+
**适用场景**:
|
|
35
|
+
- 演示文稿封面
|
|
36
|
+
- 标题页
|
|
37
|
+
- 章节标题页
|
|
38
|
+
|
|
39
|
+
**JSON 示例**:
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"layout": "TitleSlide",
|
|
43
|
+
"title": "AI 智能助手",
|
|
44
|
+
"content": [
|
|
45
|
+
"新一代人工智能助手",
|
|
46
|
+
"提升工作效率",
|
|
47
|
+
"智能对话交互"
|
|
48
|
+
],
|
|
49
|
+
"notes": "开场白"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**布局特点**:
|
|
54
|
+
- 标题:大字号、居中、加粗
|
|
55
|
+
- 内容:中等字号、居中、项目符号
|
|
56
|
+
- 适合:1-3 个要点
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### 2. ContentSlide (内容页)
|
|
61
|
+
|
|
62
|
+
**描述**:标准内容页布局,标题在顶部,内容在下方。
|
|
63
|
+
|
|
64
|
+
**适用场景**:
|
|
65
|
+
- 大部分幻灯片
|
|
66
|
+
- 内容展示
|
|
67
|
+
- 要点列表
|
|
68
|
+
|
|
69
|
+
**JSON 示例**:
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"layout": "ContentSlide",
|
|
73
|
+
"title": "核心功能",
|
|
74
|
+
"content": [
|
|
75
|
+
"自然语言理解",
|
|
76
|
+
"智能内容生成",
|
|
77
|
+
"多模态交互",
|
|
78
|
+
"个性化定制"
|
|
79
|
+
],
|
|
80
|
+
"notes": "详细介绍功能"
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**布局特点**:
|
|
85
|
+
- 标题:大字号、左对齐、加粗
|
|
86
|
+
- 内容:中等字号、左对齐、项目符号
|
|
87
|
+
- 适合:3-7 个要点
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### 3. TwoColumnSlide (两栏页)
|
|
92
|
+
|
|
93
|
+
**描述**:两栏布局,标题在顶部,内容分为左右两栏。
|
|
94
|
+
|
|
95
|
+
**适用场景**:
|
|
96
|
+
- 对比展示
|
|
97
|
+
- 并列内容
|
|
98
|
+
- 分类展示
|
|
99
|
+
|
|
100
|
+
**JSON 示例**:
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"layout": "TwoColumnSlide",
|
|
104
|
+
"title": "产品对比",
|
|
105
|
+
"content": [
|
|
106
|
+
"旧版本:功能单一",
|
|
107
|
+
"旧版本:界面陈旧",
|
|
108
|
+
"新版本:功能丰富",
|
|
109
|
+
"新版本:界面现代"
|
|
110
|
+
],
|
|
111
|
+
"notes": "对比旧版本和新版本"
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**布局特点**:
|
|
116
|
+
- 标题:大字号、左对齐、加粗
|
|
117
|
+
- 内容:中等字号、两栏对齐
|
|
118
|
+
- 适合:4-8 个要点(平均分配到两栏)
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### 4. SectionHeaderSlide (章节页)
|
|
123
|
+
|
|
124
|
+
**描述**:章节标题页布局,仅显示章节标题,无内容。
|
|
125
|
+
|
|
126
|
+
**适用场景**:
|
|
127
|
+
- 章节分隔
|
|
128
|
+
- 主题切换
|
|
129
|
+
- 过渡页
|
|
130
|
+
|
|
131
|
+
**JSON 示例**:
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"layout": "SectionHeaderSlide",
|
|
135
|
+
"title": "第一部分:产品概述",
|
|
136
|
+
"content": [],
|
|
137
|
+
"notes": "章节分隔页"
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**布局特点**:
|
|
142
|
+
- 标题:超大字号、居中、加粗
|
|
143
|
+
- 内容:无
|
|
144
|
+
- 适合:仅标题
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### 5. ContentWithCaptionSlide (带说明的内容页)
|
|
149
|
+
|
|
150
|
+
**描述**:内容页布局,标题在顶部,内容在下方,支持额外的说明文字。
|
|
151
|
+
|
|
152
|
+
**适用场景**:
|
|
153
|
+
- 图片展示
|
|
154
|
+
- 图表说明
|
|
155
|
+
- 数据展示
|
|
156
|
+
|
|
157
|
+
**JSON 示例**:
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"layout": "ContentWithCaptionSlide",
|
|
161
|
+
"title": "用户增长数据",
|
|
162
|
+
"content": [
|
|
163
|
+
"2024年 Q1:100万用户",
|
|
164
|
+
"2024年 Q2:150万用户",
|
|
165
|
+
"2024年 Q3:200万用户"
|
|
166
|
+
],
|
|
167
|
+
"notes": "图表说明:用户呈现稳定增长趋势"
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**布局特点**:
|
|
172
|
+
- 标题:大字号、左对齐、加粗
|
|
173
|
+
- 内容:中等字号、左对齐
|
|
174
|
+
- 说明:小字号、左对齐、斜体
|
|
175
|
+
- 适合:3-5 个要点 + 详细说明
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### 6. SummarySlide (总结页)
|
|
180
|
+
|
|
181
|
+
**描述**:总结页布局,标题在顶部,总结内容在下方。
|
|
182
|
+
|
|
183
|
+
**适用场景**:
|
|
184
|
+
- 演示文稿结尾
|
|
185
|
+
- 章节总结
|
|
186
|
+
- 要点回顾
|
|
187
|
+
|
|
188
|
+
**JSON 示例**:
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"layout": "SummarySlide",
|
|
192
|
+
"title": "总结",
|
|
193
|
+
"content": [
|
|
194
|
+
"AI 智能助手",
|
|
195
|
+
"提升效率,创造价值",
|
|
196
|
+
"开启智能新时代"
|
|
197
|
+
],
|
|
198
|
+
"notes": "总结发言"
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**布局特点**:
|
|
203
|
+
- 标题:大字号、左对齐、加粗
|
|
204
|
+
- 内容:中等字号、左对齐、项目符号
|
|
205
|
+
- 适合:3-5 个要点
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 布局选择建议
|
|
210
|
+
|
|
211
|
+
### 根据内容类型选择
|
|
212
|
+
|
|
213
|
+
| 内容类型 | 推荐布局 | 原因 |
|
|
214
|
+
|----------|----------|------|
|
|
215
|
+
| 封面、标题 | TitleSlide | 标题突出,视觉冲击 |
|
|
216
|
+
| 标准内容 | ContentSlide | 经典布局,易于阅读 |
|
|
217
|
+
| 对比内容 | TwoColumnSlide | 两栏对比,清晰明了 |
|
|
218
|
+
| 章节分隔 | SectionHeaderSlide | 简洁明了,区分章节 |
|
|
219
|
+
| 图片/图表 | ContentWithCaptionSlide | 内容 + 说明,完整呈现 |
|
|
220
|
+
| 总结、结尾 | SummarySlide | 重点突出,便于记忆 |
|
|
221
|
+
|
|
222
|
+
### 根据内容数量选择
|
|
223
|
+
|
|
224
|
+
| 内容数量 | 推荐布局 | 说明 |
|
|
225
|
+
|----------|----------|------|
|
|
226
|
+
| 1-3 个要点 | TitleSlide | 突出重点,简洁明了 |
|
|
227
|
+
| 3-7 个要点 | ContentSlide | 标准布局,适合大多数场景 |
|
|
228
|
+
| 4-8 个要点 | TwoColumnSlide | 两栏分布,避免拥挤 |
|
|
229
|
+
| 无内容 | SectionHeaderSlide | 仅标题,章节分隔 |
|
|
230
|
+
| 3-5 个要点 + 说明 | ContentWithCaptionSlide | 内容 + 说明,完整呈现 |
|
|
231
|
+
| 3-5 个要点 | SummarySlide | 总结回顾,重点突出 |
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 自定义布局
|
|
236
|
+
|
|
237
|
+
### 使用 notes 字段
|
|
238
|
+
|
|
239
|
+
`notes` 字段可用于添加额外的说明文字,不会在幻灯片上显示,但在 PowerPoint 的备注窗格中可见。
|
|
240
|
+
|
|
241
|
+
```json
|
|
242
|
+
{
|
|
243
|
+
"title": "核心功能",
|
|
244
|
+
"content": ["功能1", "功能2"],
|
|
245
|
+
"notes": "演讲提示:详细解释每个功能的应用场景"
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### 省略 layout 字段
|
|
250
|
+
|
|
251
|
+
如果 `layout` 字段省略,pptx-generator 将自动选择合适的布局:
|
|
252
|
+
|
|
253
|
+
- 第一页:使用 TitleSlide
|
|
254
|
+
- 最后一页:使用 SummarySlide
|
|
255
|
+
- 其他页面:使用 ContentSlide
|
|
256
|
+
|
|
257
|
+
### 内容数量自适应
|
|
258
|
+
|
|
259
|
+
pptx-generator 会根据内容数量自动调整布局:
|
|
260
|
+
|
|
261
|
+
- 1-3 个要点:使用 TitleSlide
|
|
262
|
+
- 3-7 个要点:使用 ContentSlide
|
|
263
|
+
- 4-8 个要点:使用 TwoColumnSlide
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 最佳实践
|
|
268
|
+
|
|
269
|
+
### 1. 保持布局一致性
|
|
270
|
+
|
|
271
|
+
在同一个演示文稿中,尽量使用相似的布局风格,避免过于频繁的布局切换。
|
|
272
|
+
|
|
273
|
+
### 2. 合理使用章节页
|
|
274
|
+
|
|
275
|
+
在较长的演示文稿中,使用 SectionHeaderSlide 进行章节分隔,帮助听众理解内容结构。
|
|
276
|
+
|
|
277
|
+
### 3. 避免内容过载
|
|
278
|
+
|
|
279
|
+
每页幻灯片的内容数量建议:
|
|
280
|
+
- 最少:1 个要点
|
|
281
|
+
- 最多:8 个要点
|
|
282
|
+
- 推荐:3-5 个要点
|
|
283
|
+
|
|
284
|
+
### 4. 使用备注
|
|
285
|
+
|
|
286
|
+
使用 `notes` 字段添加演讲提示,帮助自己在演讲时更好地表达。
|
|
287
|
+
|
|
288
|
+
### 5. 测试不同布局
|
|
289
|
+
|
|
290
|
+
生成 PPTX 文件后,在 PowerPoint 中打开,查看实际效果,必要时调整布局类型。
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
JSON Validator - Validate JSON format for PPT generation.
|
|
4
|
+
|
|
5
|
+
This module validates JSON data to ensure it conforms to the
|
|
6
|
+
expected format for PPT generation.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, Dict, List
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# =============================================================================
|
|
17
|
+
# JSON Validator
|
|
18
|
+
# =============================================================================
|
|
19
|
+
|
|
20
|
+
class JSONValidator:
|
|
21
|
+
"""Validator for JSON format."""
|
|
22
|
+
|
|
23
|
+
def __init__(self):
|
|
24
|
+
"""Initialize JSON validator."""
|
|
25
|
+
self.errors = []
|
|
26
|
+
self.warnings = []
|
|
27
|
+
|
|
28
|
+
def validate(self, json_path: str) -> bool:
|
|
29
|
+
"""
|
|
30
|
+
Validate JSON file.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
json_path: Path to JSON file.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
True if valid, False otherwise.
|
|
37
|
+
"""
|
|
38
|
+
print(f"验证 JSON 文件: {json_path}\n")
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
with open(json_path, 'r', encoding='utf-8') as f:
|
|
42
|
+
data = json.load(f)
|
|
43
|
+
except FileNotFoundError:
|
|
44
|
+
self.errors.append(f"文件不存在: {json_path}")
|
|
45
|
+
return False
|
|
46
|
+
except json.JSONDecodeError as e:
|
|
47
|
+
self.errors.append(f"JSON 解析错误: {e}")
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
# Validate structure
|
|
51
|
+
self._validate_structure(data)
|
|
52
|
+
|
|
53
|
+
# Print results
|
|
54
|
+
self._print_results()
|
|
55
|
+
|
|
56
|
+
return len(self.errors) == 0
|
|
57
|
+
|
|
58
|
+
def _validate_structure(self, data: Dict[str, Any]) -> None:
|
|
59
|
+
"""
|
|
60
|
+
Validate JSON structure.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
data: JSON data dictionary.
|
|
64
|
+
"""
|
|
65
|
+
# Check metadata
|
|
66
|
+
if 'metadata' not in data:
|
|
67
|
+
self.warnings.append("缺少 'metadata' 字段(推荐)")
|
|
68
|
+
else:
|
|
69
|
+
self._validate_metadata(data['metadata'])
|
|
70
|
+
|
|
71
|
+
# Check slides
|
|
72
|
+
if 'slides' not in data:
|
|
73
|
+
self.errors.append("缺少 'slides' 字段(必需)")
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
if not isinstance(data['slides'], list):
|
|
77
|
+
self.errors.append("'slides' 必须是数组")
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
if len(data['slides']) == 0:
|
|
81
|
+
self.errors.append("'slides' 数组不能为空")
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
# Validate each slide
|
|
85
|
+
for i, slide in enumerate(data['slides'], 1):
|
|
86
|
+
self._validate_slide(slide, i)
|
|
87
|
+
|
|
88
|
+
def _validate_metadata(self, metadata: Dict[str, Any]) -> None:
|
|
89
|
+
"""
|
|
90
|
+
Validate metadata.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
metadata: Metadata dictionary.
|
|
94
|
+
"""
|
|
95
|
+
if not isinstance(metadata, dict):
|
|
96
|
+
self.errors.append("'metadata' 必须是对象")
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
if 'title' not in metadata:
|
|
100
|
+
self.warnings.append("metadata 中缺少 'title' 字段(推荐)")
|
|
101
|
+
|
|
102
|
+
if 'author' not in metadata:
|
|
103
|
+
self.warnings.append("metadata 中缺少 'author' 字段(可选)")
|
|
104
|
+
|
|
105
|
+
if 'theme' not in metadata:
|
|
106
|
+
self.warnings.append("metadata 中缺少 'theme' 字段(可选)")
|
|
107
|
+
|
|
108
|
+
def _validate_slide(self, slide: Dict[str, Any], index: int) -> None:
|
|
109
|
+
"""
|
|
110
|
+
Validate a slide.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
slide: Slide data dictionary.
|
|
114
|
+
index: Slide index.
|
|
115
|
+
"""
|
|
116
|
+
if not isinstance(slide, dict):
|
|
117
|
+
self.errors.append(f"幻灯片 {index} 必须是对象")
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
# Check title
|
|
121
|
+
if 'title' not in slide:
|
|
122
|
+
self.errors.append(f"幻灯片 {index} 缺少 'title' 字段(必需)")
|
|
123
|
+
elif not isinstance(slide['title'], str):
|
|
124
|
+
self.errors.append(f"幻灯片 {index} 的 'title' 必须是字符串")
|
|
125
|
+
elif not slide['title'].strip():
|
|
126
|
+
self.errors.append(f"幻灯片 {index} 的 'title' 不能为空")
|
|
127
|
+
|
|
128
|
+
# Check content
|
|
129
|
+
if 'content' not in slide:
|
|
130
|
+
self.errors.append(f"幻灯片 {index} 缺少 'content' 字段(必需)")
|
|
131
|
+
elif not isinstance(slide['content'], list):
|
|
132
|
+
self.errors.append(f"幻灯片 {index} 的 'content' 必须是数组")
|
|
133
|
+
elif len(slide['content']) == 0:
|
|
134
|
+
self.warnings.append(f"幻灯片 {index} 的 'content' 数组为空")
|
|
135
|
+
else:
|
|
136
|
+
# Validate content items
|
|
137
|
+
for j, item in enumerate(slide['content'], 1):
|
|
138
|
+
if not isinstance(item, str):
|
|
139
|
+
self.errors.append(f"幻灯片 {index} 的 content[{j}] 必须是字符串")
|
|
140
|
+
|
|
141
|
+
# Check optional fields
|
|
142
|
+
if 'layout' in slide and not isinstance(slide['layout'], str):
|
|
143
|
+
self.warnings.append(f"幻灯片 {index} 的 'layout' 应该是字符串")
|
|
144
|
+
|
|
145
|
+
if 'notes' in slide and not isinstance(slide['notes'], str):
|
|
146
|
+
self.warnings.append(f"幻灯片 {index} 的 'notes' 应该是字符串")
|
|
147
|
+
|
|
148
|
+
def _print_results(self) -> None:
|
|
149
|
+
"""Print validation results."""
|
|
150
|
+
if self.errors:
|
|
151
|
+
print(f"❌ 发现 {len(self.errors)} 个错误:\n")
|
|
152
|
+
for i, error in enumerate(self.errors, 1):
|
|
153
|
+
print(f" {i}. {error}")
|
|
154
|
+
print()
|
|
155
|
+
|
|
156
|
+
if self.warnings:
|
|
157
|
+
print(f"⚠️ 发现 {len(self.warnings)} 个警告:\n")
|
|
158
|
+
for i, warning in enumerate(self.warnings, 1):
|
|
159
|
+
print(f" {i}. {warning}")
|
|
160
|
+
print()
|
|
161
|
+
|
|
162
|
+
if not self.errors and not self.warnings:
|
|
163
|
+
print("✓ JSON 格式验证通过!\n")
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# =============================================================================
|
|
167
|
+
# Main Function
|
|
168
|
+
# =============================================================================
|
|
169
|
+
|
|
170
|
+
def main():
|
|
171
|
+
"""Main entry point."""
|
|
172
|
+
parser = argparse.ArgumentParser(
|
|
173
|
+
description='Validate JSON format for PPT generation'
|
|
174
|
+
)
|
|
175
|
+
parser.add_argument(
|
|
176
|
+
'--input', '-i',
|
|
177
|
+
required=True,
|
|
178
|
+
help='Input JSON file path'
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
args = parser.parse_args()
|
|
182
|
+
|
|
183
|
+
# Create validator
|
|
184
|
+
validator = JSONValidator()
|
|
185
|
+
|
|
186
|
+
# Validate
|
|
187
|
+
is_valid = validator.validate(args.input)
|
|
188
|
+
|
|
189
|
+
# Exit with appropriate code
|
|
190
|
+
sys.exit(0 if is_valid else 1)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
if __name__ == '__main__':
|
|
194
|
+
main()
|