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

2.3 KiB

המרת .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 (בשורש הפרויקט) עושה את זה. הרץ אותו:

  • פעם אחת אחרי clone של הפרויקט (אם skills/docx/decision_template.docx לא קיים).
  • בכל פעם שדפנה מעדכנת את data/training/טיוטת החלטה.dotx.
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.