69 lines
1.8 KiB
Python
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))
|