1
0
Files
PPTX/openspec/changes/archive/2026-03-02-add-text-auto-wrap/design.md
lanyuanxiaoyao b2132dc06b feat: enable text auto-wrap for text boxes by default
- 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
2026-03-02 15:23:14 +08:00

98 lines
3.5 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.
# 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` 赋值后添加:
```python
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
1. **Phase 1**: 修改 `add_text_element()` 函数,添加 `tf.word_wrap = True`
2. **Phase 2**: 修改 `render_text_element_to_html()` 函数,更新 CSS 样式
3. **Phase 3**: 创建测试 YAML 文件,包含长文本内容验证效果
4. **Phase 4**: 更新 README.md 说明文本框默认自动换行
**Rollback Strategy:** 如有问题,删除添加的代码行即可快速回滚
## Open Questions
无。这是一个简单直接的功能改进,实现方式清晰。