← Files Investment BankingARCHIVED FILE
shared/office_artifacts.py
4.06 KB · Oct 2, 2026 · 00:27 UTC
from __future__ import annotations
import html
import zipfile
from pathlib import Path
from typing import Sequence
def write_minimal_docx(path: str | Path, title: str, paragraphs: Sequence[str]) -> Path:
target = Path(path)
target.parent.mkdir(parents=True, exist_ok=True)
body = "".join(
f"<w:p><w:r><w:t>{html.escape(str(p))}</w:t></w:r></w:p>" for p in [title, *paragraphs]
)
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"/></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/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
def write_minimal_pptx(path: str | Path, title: str, bullets: Sequence[str]) -> Path:
target = Path(path)
target.parent.mkdir(parents=True, exist_ok=True)
bullet_text = " ".join(str(item) for item in bullets)
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="/ppt/presentation.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"/><Override PartName="/ppt/slides/slide1.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slide+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="ppt/presentation.xml"/></Relationships>',
)
archive.writestr(
"ppt/presentation.xml",
'<?xml version="1.0" encoding="UTF-8"?><p:presentation xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><p:sldIdLst><p:sldId id="256" r:id="rId1"/></p:sldIdLst></p:presentation>',
)
archive.writestr(
"ppt/_rels/presentation.xml.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/slide" Target="slides/slide1.xml"/></Relationships>',
)
archive.writestr(
"ppt/slides/slide1.xml",
f'<?xml version="1.0" encoding="UTF-8"?><p:sld xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr/><p:grpSpPr/><p:sp><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:t>{html.escape(title)}</a:t></a:r></a:p><a:p><a:r><a:t>{html.escape(bullet_text)}</a:t></a:r></a:p></p:txBody></p:sp></p:spTree></p:cSld></p:sld>',
)
return target
SHA-256: da47965be7e95e847501464af968ea3623c90117f2da123486ffb02473e46cb8