Files
Tracker/Code/Tools/Samples/generators/docx_memo.py
T
2026-02-21 21:55:42 +00:00

69 lines
1.8 KiB
Python

"""Generate DOCX: Internal memo."""
from pathlib import Path
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
def generate(output_path: Path, firm: dict, body: str, date: str, subject: str):
"""Generate an internal memo document."""
doc = Document()
style = doc.styles["Normal"]
font = style.font
font.name = "Arial"
font.size = Pt(11)
# MEMO header
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("INTERNAL MEMORANDUM")
run.bold = True
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(0, 51, 102)
# Confidential marker
conf = doc.add_paragraph()
conf.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = conf.add_run("CONFIDENTIAL")
run.font.size = Pt(9)
run.font.color.rgb = RGBColor(200, 0, 0)
doc.add_paragraph("_" * 60).runs[0].font.color.rgb = RGBColor(180, 180, 180)
# Memo fields
fields = [
("TO:", firm["attorney"]["name"]),
("FROM:", firm["attorney"]["name"]),
("DATE:", date),
("RE:", subject),
]
for label, value in fields:
p = doc.add_paragraph()
run_label = p.add_run(f"{label}\t")
run_label.bold = True
run_label.font.size = Pt(11)
run_value = p.add_run(value)
run_value.font.size = Pt(11)
doc.add_paragraph("_" * 60).runs[0].font.color.rgb = RGBColor(180, 180, 180)
doc.add_paragraph()
# Body
for para_text in body.split("\n\n"):
if para_text.strip():
doc.add_paragraph(para_text.strip())
doc.add_paragraph()
# Sign-off
p = doc.add_paragraph()
run = p.add_run(firm["attorney"]["name"])
run.bold = True
doc.add_paragraph("Partner")
doc.add_paragraph(firm["name"])
doc.save(str(output_path))