pptx-translate, chinese-text-normalize, dharma-translation: canonical location now ./skills/ with symlinks in ~/.hermes/skills/. translation-review: merged CSV/XLSX review + .dj comparison workflows into single SKILL.md. Added buddhist-terminology.md and terms-db-alignment.md references from Hermes version.
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
import sys, yaml
|
|
from pptx import Presentation
|
|
from pptx.util import Pt
|
|
from pptx.enum.text import MSO_AUTO_SIZE
|
|
|
|
FONT_SCALE = 0.82 # shrink ~18%
|
|
|
|
yaml_path, src_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3]
|
|
|
|
with open(yaml_path) as f:
|
|
entries = yaml.safe_load(f)
|
|
|
|
index = {}
|
|
for e in entries:
|
|
index[(e["slide"], e["shape"], e["run"])] = e["en"]
|
|
|
|
|
|
def shrink_font_tf(tf):
|
|
for para in tf.paragraphs:
|
|
for run in para.runs:
|
|
if run.font.size:
|
|
run.font.size = Pt(int(run.font.size.pt * FONT_SCALE))
|
|
try:
|
|
tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
prs = Presentation(src_path)
|
|
|
|
for slide_num, slide in enumerate(prs.slides, 1):
|
|
for shape_idx, shape in enumerate(slide.shapes):
|
|
if shape.has_text_frame:
|
|
has_translation = False
|
|
for para_idx, para in enumerate(shape.text_frame.paragraphs):
|
|
key = (slide_num, shape_idx, para_idx)
|
|
if key in index:
|
|
has_translation = True
|
|
en = index[key]
|
|
for r in para.runs:
|
|
r.text = ""
|
|
if para.runs:
|
|
para.runs[0].text = en
|
|
else:
|
|
para.add_run().text = en
|
|
if has_translation:
|
|
shrink_font_tf(shape.text_frame)
|
|
|
|
elif shape.has_table:
|
|
num_rows = len(shape.table.rows)
|
|
for r in range(num_rows * len(shape.table.columns)):
|
|
key = (slide_num, shape_idx, r)
|
|
if key in index:
|
|
row = r % num_rows
|
|
col = r // num_rows
|
|
shape.table.cell(row, col).text = index[key]
|
|
for row in shape.table.rows:
|
|
for cell in row.cells:
|
|
shrink_font_tf(cell.text_frame)
|
|
|
|
key = (slide_num, -1, 0)
|
|
if key in index and slide.has_notes_slide:
|
|
ns = slide.notes_slide
|
|
ns.notes_text_frame.clear()
|
|
ns.notes_text_frame.paragraphs[0].add_run().text = index[key]
|
|
|
|
prs.save(out_path)
|
|
print(f"Saved {out_path}")
|