#!/usr/bin/env python3
"""Embed Open Sans / Open Sans Light TTFs into a docx so it renders correctly
even on machines that don't have the fonts installed. Mirrors the (unobfuscated)
embedding scheme found in the Cloud Drift case-study docx: fontKey all-zeros,
plain .ttf parts referenced directly."""
import shutil
import zipfile
import re
import sys
DOCX = sys.argv[1] if len(sys.argv) > 1 else "clouddrift-reference.docx"
FONT_DIR = "fonts"
FONTS = {
"Open Sans Light": {
"regular": "OpenSansLight-regular.ttf",
"bold": "OpenSansLight-bold.ttf",
"italic": "OpenSansLight-italic.ttf",
"boldItalic": "OpenSansLight-boldItalic.ttf",
},
"Open Sans": {
"regular": "OpenSans-regular.ttf",
"bold": "OpenSans-bold.ttf",
"italic": "OpenSans-italic.ttf",
"boldItalic": "OpenSans-boldItalic.ttf",
},
}
NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
FONT_REL_TYPE = f"{NS_R}/font".replace(NS_R, "http://schemas.openxmlformats.org/officeDocument/2006/relationships") + "/font"
FONT_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/font"
def build_font_table_and_rels():
rid = 1
font_entries = []
rels = []
file_map = {}
for name, variants in FONTS.items():
embeds = []
for kind, fname in variants.items():
tag = {
"regular": "w:embedRegular",
"bold": "w:embedBold",
"italic": "w:embedItalic",
"boldItalic": "w:embedBoldItalic",
}[kind]
rId = f"rIdFont{rid}"
embeds.append(
f'<{tag} r:id="{rId}" w:fontKey="{{00000000-0000-0000-0000-000000000000}}" w:subsetted="0"/>'
)
rels.append(
f''
)
file_map[rId] = fname
rid += 1
font_entries.append(f'{"".join(embeds)}')
font_table_xml = (
''
''
+ "".join(font_entries)
+ ""
)
rels_xml = (
''
''
+ "".join(rels)
+ ""
)
return font_table_xml, rels_xml, file_map
def patch_settings(xml_text):
if "embedTrueTypeFonts" in xml_text:
return xml_text
return re.sub(
r"(]*>)",
r'\1',
xml_text,
count=1,
)
def patch_content_types(xml_text):
if 'Extension="ttf"' in xml_text:
return xml_text
return xml_text.replace(
"