Files
legal-ai/skills/dafna-decision-template/references/dotx-to-docx.md
Chaim bfec8bdaa3
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 6s
Add dafna-decision-template skill — knowledge for template-based DOCX export
Documents the rules and decisions behind building DOCX files from דפנה's
decision template (טיוטת החלטה.dotx). The implementation lives in
mcp-server/src/legal_mcp/services/analysis_docx_exporter.py; this skill
captures the "why" so future improvements don't need to rediscover it.

Contents:
  SKILL.md                       5 critical rules, style mapping table,
                                 export flow, line classification,
                                 dash policy, placeholder handling,
                                 troubleshooting, future TODOs
  references/dotx-to-docx.md     why python-docx can't open .dotx +
                                 the conversion recipe
  references/rtl-runs.md         why <w:rtl/> is required on every run
                                 (otherwise Hebrew falls back to
                                 Times New Roman)
  references/style-mapping.md    XML dump of every template style,
                                 with the Title-via-theme gotcha
  references/line-classification.md  the 7 regex categories in
                                 _classify_line() with real examples

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 18:57:57 +00:00

59 lines
2.3 KiB
Markdown

# המרת `.dotx` → `.docx` עבור python-docx
## למה
python-docx **לא יודע לפתוח** קובצי Word Template (`.dotx`). ניסיון לפתיחה
זורק:
```
ValueError: file 'X.dotx' is not a Word file, content type is
'application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml'
```
כי `main document part` של `.dotx` מסומן כ-template, לא כ-document.
## הפתרון — המרה חד-פעמית
קובץ `.dotx` הוא ZIP שכולל את אותם parts כמו `.docx` + `word/glossary/`
(building blocks). להמרה:
1. פתח את ה-ZIP.
2. **הסר** את כל ה-parts תחת `word/glossary/`.
3. **תקן** `[Content_Types].xml`:
- החלף `template.main+xml` ב-`document.main+xml`
- הסר `<Override>` entries שמצביעים ל-`/word/glossary/...`
4. **תקן** `word/_rels/document.xml.rels`:
- הסר את ה-`<Relationship>` עם
`Type=".../relationships/glossaryDocument"`
5. שמור מחדש כ-ZIP עם סיומת `.docx`.
## הסקריפט
[`scripts/convert_decision_template.py`](../../../scripts/convert_decision_template.py)
(בשורש הפרויקט) עושה את זה. הרץ אותו:
- פעם אחת אחרי clone של הפרויקט (אם `skills/docx/decision_template.docx`
לא קיים).
- בכל פעם שדפנה מעדכנת את `data/training/טיוטת החלטה.dotx`.
```bash
python scripts/convert_decision_template.py
# → skills/docx/decision_template.docx
```
הסקריפט כולל verification שבודק שהקובץ שנוצר נטען נקי ב-python-docx
ושהסגנונות הקריטיים (Normal, Heading 2, Quote, List Paragraph, Title)
נמצאים בו.
## למה לא `docxtpl`?
`docxtpl` מיועד ל-**placeholder substitution** סגנון Jinja2
(`{{ variable }}`). הטמפלט שלנו לא מכיל placeholders — אנחנו מרכיבים
תוכן דינמי. `python-docx` על טמפלט `.docx` נקי מספיק לגמרי.
## הימנע מ-
- **אל תנסה** להוריד את ה-glossary רק מ-`[Content_Types].xml` בלי להסיר
את ה-`<Relationship>` שמפנה אליו → תקבל dangling reference.
- **אל תנסה** להשתמש ב-`.dotx` ישירות דרך `zipfile` + לבנות Document
ידנית — חוסך 10 שורות אבל מאבד את כל ה-robustness של python-docx.