← Files Public Equity InvestingARCHIVED FILE
shared/office_artifacts.py
2.47 KB · Oct 2, 2026 · 00:03 UTC
from __future__ import annotations
import html
import zipfile
from pathlib import Path
from typing import Sequence
def _paragraph_xml(text: str, style: str = "") -> str:
style_xml = f'<w:pPr><w:pStyle w:val="{style}"/></w:pPr>' if style else ""
return f"<w:p>{style_xml}<w:r><w:t>{html.escape(str(text))}</w:t></w:r></w:p>"
def write_structured_docx(
path: str | Path,
title: str,
sections: Sequence[tuple[str, Sequence[str]]],
) -> Path:
target = Path(path)
target.parent.mkdir(parents=True, exist_ok=True)
body_parts = [_paragraph_xml(title, "Title")]
for heading, paragraphs in sections:
body_parts.append(_paragraph_xml(heading, "Heading1"))
body_parts.extend(_paragraph_xml(paragraph or "Not provided") for paragraph in paragraphs)
body = "".join(body_parts)
with zipfile.ZipFile(target, "w", zipfile.ZIP_DEFLATED) as archive:
archive.writestr(
"[Content_Types].xml",
'<?xml version="1.0" encoding="UTF-8"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/></Types>',
)
archive.writestr(
"_rels/.rels",
'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships>',
)
archive.writestr(
"word/styles.xml",
'<?xml version="1.0" encoding="UTF-8"?><w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:style w:type="paragraph" w:styleId="Title"><w:name w:val="Title"/></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/></w:style></w:styles>',
)
archive.writestr(
"word/document.xml",
f'<?xml version="1.0" encoding="UTF-8"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body>{body}<w:sectPr/></w:body></w:document>',
)
return target
SHA-256: 8ffd7ca95795e9abfbcc027c59b2cbaf926356e695920135d7576755d5ca22c3