1
0

refactor: modularize yaml2pptx into layered architecture

Refactor yaml2pptx.py from a 1,245-line monolithic script into a modular
architecture with clear separation of concerns. The entry point is now
127 lines, with business logic distributed across focused modules.

Architecture:
- core/: Domain models (elements, template, presentation)
- loaders/: YAML loading and validation
- renderers/: PPTX and HTML rendering
- preview/: Flask preview server
- utils.py: Shared utilities

Key improvements:
- Element abstraction layer using dataclass with validation
- Renderer logic built into generator classes
- Single-direction dependencies (no circular imports)
- Each module 150-300 lines for better readability
- Backward compatible CLI interface

Documentation:
- README.md: User-facing usage guide
- README_DEV.md: Developer documentation

OpenSpec:
- Archive refactor-yaml2pptx-modular change (63/70 tasks complete)
- Sync 5 delta specs to main specs (2 new + 3 updated)
This commit is contained in:
2026-03-02 16:43:45 +08:00
parent b2132dc06b
commit ed940f0690
31 changed files with 3142 additions and 1307 deletions

View File

@@ -0,0 +1,52 @@
## Why
yaml2pptx.py 脚本已增长到 1,245 行,包含了 YAML 解析、模板系统、元素渲染、PPTX 生成、HTML 预览等多个功能模块。单文件结构导致代码难以阅读、维护和扩展,对开发者和 LLM 工具都不友好。需要将其重构为模块化结构,同时引入元素抽象层,为未来添加新元素类型和渲染器奠定基础。
## What Changes
- 将 yaml2pptx.py 拆分为多个功能模块文件,按 core/loaders/renderers/preview 四层架构组织
- 引入元素抽象层,使用 dataclass 定义元素数据类TextElement, ImageElement, ShapeElement, TableElement
- 在元素创建时进行验证(`__post_init__` 方法)
- 重构 PPTX 生成器,将渲染器内置在 PptxGenerator 类中
- 重构 HTML 渲染器,作为独立的 HtmlRenderer 类用于预览功能
- 保持 yaml2pptx.py 作为单一入口点,所有依赖声明保留在入口脚本的 `/// script` 头部
- 保持向后兼容:`uv run yaml2pptx.py` 的使用方式不变
## Capabilities
### New Capabilities
- `modular-architecture`: 模块化代码架构,将单文件脚本拆分为 core核心领域模型、loaders加载器、renderers渲染器、preview预览服务四层结构每个模块职责清晰文件大小控制在 150-300 行
- `element-abstraction`: 元素抽象层,定义统一的元素接口和数据类,支持元素验证和未来扩展新元素类型
### Modified Capabilities
- `element-rendering`: 从函数式渲染改为基于元素数据类的面向对象渲染,引入元素抽象层和创建时验证
- `pptx-generation`: 重构为内置渲染器的架构PptxGenerator 类内部包含 PPTX 渲染逻辑,通过元素类型分发到对应的渲染方法
- `html-rendering`: 从内联函数重构为独立的 HtmlRenderer 类,与 PptxRenderer 共享元素抽象层
## Impact
**代码结构**
- yaml2pptx.py从 1,245 行缩减为约 100 行(仅保留 CLI 和 main 函数)
- 新增文件:
- core/elements.py元素数据类
- core/template.pyTemplate 类)
- core/presentation.pyPresentation 类)
- loaders/yaml_loader.pyYAML 加载和验证)
- renderers/pptx_renderer.pyPptxGenerator
- renderers/html_renderer.pyHtmlRenderer
- preview/server.pyFlask 服务器和文件监听)
- utils.py工具函数
**导入路径**
- 内部导入路径会发生变化(如 `from core.elements import TextElement`
- 外部使用方式不变(`uv run yaml2pptx.py input.yaml output.pptx`
**依赖管理**
- 所有依赖保持在 yaml2pptx.py 的 `/// script` 头部
- 预览功能的依赖flask, watchdog不再可选统一在入口声明
**测试和验证**
- 需要验证所有现有功能在重构后仍正常工作
- 需要测试 YAML 解析、模板渲染、PPTX 生成、HTML 预览等完整流程