Files
2026Technology-Competition/docs/superpowers/specs/2026-07-24-word-ppt-import-design.md
T
范智鹏 effcf30802 feat: 适配器 i18n + Provider 动态注册 + SetupView 重构 + jars 资源
- 适配器 i18n 接入(eslint/pmd/sql-lint/stylelint)
- Provider 动态注册机制(registry.ts + providers.json + factory 重构)
- SetupView 全面重构(setupView.ts 新增 600+ 行)
- i18n 消息扩展(messages.ts +210 行)
- 规则导入流程优化(import-service / prompt-builder)
- 新增 PMD jars 依赖及测试用例
2026-07-28 22:57:15 +08:00

137 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Word / PPT 规则导入设计
## 1. 背景
当前自定义规则导入支持 YAML、Markdown、TXT、Excel.xlsx/.xls)格式,用户需要补充 Word.docx)和 PowerPoint.pptx)文件导入能力。
## 2. 目标
- 支持 .docx 文件导入:通过 mammoth 提取 Markdown 文本,AI 转换为规则 YAML
- 支持 .pptx 文件导入:通过 officeparser 提取幻灯片文本,AI 转换为规则 YAML
- 沿用现有 Converter 架构(RuleConverter 接口 + ImportService 注册机制)
## 3. 架构
### 3.1 数据流
```
setupView.ts (addRule)
ImportService.convert(srcPath, context)
├── path.extname → DocxConverter (.docx)
│ └── mammoth.extractRawText() / convertToMarkdown()
│ └── Markdown 文本 → convertContentWithAI() → YAML
├── path.extname → PptxConverter (.pptx)
│ └── officeparser.parsePptx()
│ └── 纯文本(幻灯片逐页分隔)→ convertContentWithAI() → YAML
└── parseImportableYaml() → 预览 → 写入 .code-review/rules/<name>.yaml
```
### 3.2 现有架构映射
| 组件 | 文件 | 说明 |
|------|------|------|
| RuleConverter 接口 | `src/rules/converters/converter.ts` | 不变 |
| ImportService | `src/rules/import-service.ts` | 不变 |
| convertContentWithAI | `src/rules/import-service.ts` | 复用 |
| setupView 注册 | `src/views/setupView.ts` | 新增两个 converter 注册 + 更新文件过滤器 |
## 4. 文件变更清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `src/rules/converters/docx-converter.ts` | **新建** | .docx → mammoth → AI → YAML |
| `src/rules/converters/pptx-converter.ts` | **新建** | .pptx → officeparser → AI → YAML |
| `src/views/setupView.ts` | **修改** | 注册两个新 converter + 更新文件过滤器 |
| `package.json` | **修改** | 添加 mammoth + officeparser 依赖 |
## 5. 关键实现
### 5.1 DocxConverter
```typescript
// src/rules/converters/docx-converter.ts
// 依赖:mammoth(将 .docx 提取为 Markdown/HTML
//
// 行为:
// 1. mammoth.convertToMarkdown() 提取 Markdown(含表格→Markdown 表格)
// 2. 将 Markdown 文本传入 convertContentWithAI()
// 3. AI 按已有 prompt 生成 YAML 规则
//
// 复用现有 buildSystemPrompt() 模式
// systemPrompt 与 md-converter.ts 相同(自然语言规则描述 → YAML)
// 由于 mammoth 已产出 MarkdownAI 可识别表格/段落/列表结构
```
### 5.2 PptxConverter
```typescript
// src/rules/converters/pptx-converter.ts
// 依赖:officeparser(将 .pptx 提取为纯文本)
//
// 行为:
// 1. officeparser.parsePptx() 提取所有幻灯片文本
// 2. 幻灯片之间用 "\n\n--- Slide N ---\n\n" 分隔
// 3. 合并文本传入 convertContentWithAI()
// 4. AI 按已有 prompt 生成 YAML 规则
//
// systemPrompt 与 md-converter.ts 相同
```
### 5.3 setupView.ts 变更
```typescript
// 1. 导入新 converter
import { DocxConverter } from '../rules/converters/docx-converter';
import { PptxConverter } from '../rules/converters/pptx-converter';
// 2. 构造函数中注册
this.importService.registerConverter(new DocxConverter());
this.importService.registerConverter(new PptxConverter());
// 3. addRule() 文件过滤器增加扩展名
filters: { '规则文件': ['yaml', 'yml', 'md', 'txt', 'xlsx', 'xls', 'docx', 'pptx'] },
```
### 5.4 package.json 依赖
```json
"dependencies": {
...,
"mammoth": "^1.8.0",
"officeparser": "^4.2.0"
}
```
## 6. 错误处理
| 场景 | 处理方式 |
|------|----------|
| docx 文件损坏 | mammoth 抛出异常 → try/catch 弹错误提示 → return null |
| pptx 文件损坏 | officeparser 抛出异常 → try/catch 弹错误提示 → return null |
| docx 无内容 | mammoth 返回空字符串 → convertContentWithAI 检测到空内容 → 弹"所选文件为空" |
| pptx 无内容 | officeparser 返回空字符串 → 同上 |
| officeparser 未安装依赖 | 运行时缺 jszip 报错 → catch 弹提示 |
## 7. 不涉及变更
- `converter.ts`RuleConverter 接口不变
- `import-service.ts`ImportService、convertContentWithAI、parseImportableYaml 均不变
- `import-preview.ts`:预览 Webview 不变
- `yaml-parser.ts`:运行时加载不变
- `rule-filter.ts`:规则过滤不变
- 其他 converter:不受影响
- 前端 webview JS`src/views/setupView.js`):无变更
## 8. 测试
新增文件不涉及现有测试变更。可通过以下方式验证:
1. 准备一个含规则表格的 .docx 文件和一个含规则列表的 .pptx 文件
2. 在设置面板中点击"+ 添加",分别选择 .docx 和 .pptx 文件
3. 检查预览是否正确解析规则,命中等
4. 确认 .code-review/rules/ 下生成正确的 .yaml 文件