- Set text_frame.word_wrap = True in add_text_element() for PPTX - Change CSS from white-space: pre-wrap to normal in HTML preview - Add overflow-wrap: break-word for better word breaking - Update README.md with auto-wrap documentation - Update element-rendering and html-rendering specs - Archive change: 2026-03-02-add-text-auto-wrap
3.5 KiB
Design: 文本框默认自动换行
Context
当前 yaml2pptx.py 中的 add_text_element() 函数创建 PPTX 文本框时,未设置 word_wrap 属性。python-pptx 的 TextFrame 默认行为是 word_wrap = False,这意味着长文本会溢出文本框边界。同样,HTML 预览中的 render_text_element_to_html() 函数使用 white-space: pre-wrap,这会保留所有空格和换行符,但对于自动换行的处理不够理想。
Current State:
- PPTX 生成:
tf.word_wrap未设置,默认为False,长文本会溢出 - HTML 预览:使用
white-space: pre-wrap,保留格式但不确保自动换行
Constraints:
- 必须保持向后兼容性(此改进不会破坏现有功能)
- PPTX 和 HTML 预览行为应该一致
- 不能引入新的外部依赖
Goals / Non-Goals
Goals:
- 文本框默认启用文字自动换行
- 同步更新 PPTX 生成和 HTML 预览的行为
- 用户无需修改任何 YAML 配置
Non-Goals:
- 添加 YAML
wrap属性(不需要,直接默认启用) - 文本框大小自动调整
- 文字大小自动缩放以适应文本框
Decisions
1. 直接默认启用自动换行,无需配置
Decision: 不添加任何 YAML 属性,直接在代码中设置 word_wrap = True
Rationale:
- 自动换行是文本框的合理默认行为
- 用户无需学习新的配置选项
- 简化代码,减少配置复杂度
- 符合大多数演示文稿软件的默认行为
Alternatives Considered:
- 添加
wrap属性:增加配置复杂度,大部分用户都会希望自动换行
2. PPTX 实现方式
Decision: 在创建文本框后直接设置 text_frame.word_wrap = True
Rationale:
- python-pptx 原生支持此功能,无需额外依赖
- 代码改动最小,只需添加一行
- 性能开销为零
Code Location: yaml2pptx.py 第 406 行附近,在 textbox.text_frame 赋值后添加:
tf.word_wrap = True
3. HTML 预览实现方式
Decision: 将 CSS white-space: pre-wrap 改为 white-space: normal
Rationale:
normal是 CSS 默认值,允许文字在容器边界处自动换行- 与 PPTX 的
word_wrap = True行为一致 - 对于包含
\n的内容,可以单独处理或在需要时使用pre-wrap
Code Location: yaml2pptx.py 第 902 行,修改 render_text_element_to_html() 函数中的样式
Risks / Trade-offs
Risk 1: 包含手动换行符的文本
Risk: 如果用户在 YAML 中使用 \n 手动换行,white-space: normal 会忽略这些换行符
Mitigation:
- 可以改用
white-space: pre-wrap或white-space: break-spaced来同时支持自动换行和手动换行 - 测试验证哪种行为更符合预期
Risk 2: 现有布局可能有细微变化
Risk: 启用自动换行后,某些长文本的显示方式可能与之前不同
Mitigation:
- 此变化是改进性的,使文本正确显示而非溢出
- 用户可以通过调整文本框大小来控制显示效果
Migration Plan
- Phase 1: 修改
add_text_element()函数,添加tf.word_wrap = True - Phase 2: 修改
render_text_element_to_html()函数,更新 CSS 样式 - Phase 3: 创建测试 YAML 文件,包含长文本内容验证效果
- Phase 4: 更新 README.md 说明文本框默认自动换行
Rollback Strategy: 如有问题,删除添加的代码行即可快速回滚
Open Questions
无。这是一个简单直接的功能改进,实现方式清晰。