161 lines
7.7 KiB
Python
161 lines
7.7 KiB
Python
#!/usr/bin/env python3
|
||
"""生成 U24-L2 转段剧本 Excel"""
|
||
|
||
import openpyxl
|
||
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
|
||
|
||
wb = openpyxl.Workbook()
|
||
ws = wb.active
|
||
ws.title = "U24-L2_转"
|
||
|
||
headers = ["类型", "剧情描述", "角色名", "编剧台词"]
|
||
header_font = Font(bold=True, size=11)
|
||
header_fill = PatternFill(start_color="D9E1F2", end_color="D9E1F2", fill_type="solid")
|
||
thin_border = Border(
|
||
left=Side(style="thin"), right=Side(style="thin"),
|
||
top=Side(style="thin"), bottom=Side(style="thin"),
|
||
)
|
||
|
||
for col, h in enumerate(headers, 1):
|
||
cell = ws.cell(row=1, column=col, value=h)
|
||
cell.font = header_font
|
||
cell.fill = header_fill
|
||
cell.alignment = Alignment(horizontal="center", vertical="center")
|
||
cell.border = thin_border
|
||
|
||
ws.column_dimensions["A"].width = 16
|
||
ws.column_dimensions["B"].width = 60
|
||
ws.column_dimensions["C"].width = 16
|
||
ws.column_dimensions["D"].width = 50
|
||
|
||
# ⚠️ 对话互动仅首行标"中互动",User行类型留空
|
||
rows = [
|
||
# === #0: 看火 ===
|
||
["TL", "【场景】Tom的厨房\n【角色】User、Mama Green、Sue、Jay、Lin", "", ""],
|
||
["", "Jay和Lin站在灶台前,盯着火焰,一动不动。表情异常严肃,如临大敌。", "", ""],
|
||
["", "【emoji】Jay云朵气泡", "Jay", "She said to watch the fire."],
|
||
["", "", "Lin", "There must be a deeper meaning."],
|
||
["", "两人对视,郑重地点头。火焰在锅里跳跃,他们继续凝视——眼睛都不眨。", "", ""],
|
||
|
||
# === #1: 看傻了 ===
|
||
["TL", "Sue和User在远处洗番茄,瞥见两人僵硬的背影。", "", ""],
|
||
["", "【emoji】Sue问号", "Sue", "What are they doing?"],
|
||
["", "【镜头】Jay和Lin背影——纹丝不动,如两尊石像。", "", ""],
|
||
["", "镜头切到油锅:油面开始冒细烟。两人浑然不觉。", "", ""],
|
||
["", "Lin掏出一支筷子在火焰上方比划,仿佛在测量某种未知能量。", "", ""],
|
||
["", "烟雾越来越浓,弥漫整个厨房。User和Sue开始咳嗽。", "", ""],
|
||
|
||
# === #2: 着火 ===
|
||
["TL", "【emoji】Sue惊讶", "Sue", "The fire!"],
|
||
["", "", "Sue", "It's **really** dangerous!"],
|
||
["", "Sue抓住User的胳膊,指向灶台旁挂着的锅盖。", "", ""],
|
||
["", "", "Sue", "The lid! Quick!"],
|
||
["中互动", "", "Sue", "Say it loud!"],
|
||
["", "", "User", "Use the lid!"],
|
||
|
||
# === #3: Green灭火 + 吐槽 ===
|
||
["TL", "Mama Green冲进厨房,一把抓起锅盖——", "", ""],
|
||
["", "啪!精准地盖住火焰。烟雾渐渐散去。", "", ""],
|
||
["", "她转头看着缩在角落的Jay和Lin,两人灰头土脸,头顶还飘着细烟。", "", ""],
|
||
["", "【emoji】Mama Green生气", "Mama Green", "The **kids** are calmer and braver than you!"],
|
||
["", "Mama Green指了指User和Sue。", "", ""],
|
||
["", "【emoji】Jay流汗", "", ""],
|
||
["", "【emoji】Lin流汗", "", ""],
|
||
["", "Jay和Lin缩着脖子,一声不敢吭。", "", ""],
|
||
|
||
# === #4: Tony带人冲入 ===
|
||
["TL", "【音效】急促的脚步声。", "", ""],
|
||
["", "Tony推开门,Ben、May、Vicky跟在后面。", "", ""],
|
||
["", "【emoji】Tony惊讶", "Tony", "What happened?!"],
|
||
["", "Ben、May、Vicky看着满屋烟雾,目瞪口呆。", "", ""],
|
||
["", "", "May", "The **kitchen** is full of smoke!"],
|
||
["", "Sue站出来,拍拍User的肩膀。", "", ""],
|
||
["", "", "Sue", "You tell them everything!"],
|
||
|
||
# === #5: 核心互动·写作 ===
|
||
["核心互动-写作",
|
||
"【插入图】厨房场景大图:灶台、油锅(已盖上盖)、Jay和Lin缩在角落灰头土脸、Mama Green双手叉腰、Sue和User站在一旁。"
|
||
"\n请User在下方句子中填入正确的单词,补全事件描述。",
|
||
"", ""],
|
||
["",
|
||
"第1处 — 第一句填空:\"Smoke in the ___.\"\n"
|
||
"配图提示:厨房冒烟的镜头特写。待拼写单词:**kitchen**",
|
||
"", ""],
|
||
["",
|
||
"第2处 — 第二句填空:\"It was ___ dangerous.\"\n"
|
||
"配图提示:火焰在锅中跳跃的特写。待拼写单词:**really**",
|
||
"", ""],
|
||
["",
|
||
"第3处 — 第三句填空:\"A ___ helped!\"\n"
|
||
"配图提示:Sue和User一起指向锅盖。待拼写单词:**kid**",
|
||
"", ""],
|
||
|
||
# === #6: 认错 + kid #3 ===
|
||
["TL", "Ben拿起抹布擦台面,May和Vicky捡起地上的碎蛋壳,User和Sue也在帮忙。", "", ""],
|
||
["", "Jay和Lin站在一旁,低着头。众人收拾的画面在他们面前展开。", "", ""],
|
||
["", "【emoji】Jay黑线", "Jay", "...Kids can do **many** things."],
|
||
["", "【emoji】Lin黑线", "Lin", "More than us."],
|
||
["", "Mama Green拍了拍手上的灰,嘴角微扬,转头看着User。", "", ""],
|
||
["", "", "Mama Green", "Who helped me today?"],
|
||
["中互动", "", "Sue", "Go on."],
|
||
["", "", "User", "A **kid** can help!"],
|
||
|
||
# === #7: 收尾·合段钩子 ===
|
||
["TL", "厨房终于恢复整洁。Mama Green重新起锅,火焰稳定。", "", ""],
|
||
["", "大家围在灶台前,汉堡的香味开始飘散。", "", ""],
|
||
["", "突然——【音效】啪的一声,灯灭了。厨房陷入一片黑暗。", "", ""],
|
||
["", "黑暗中传来一声闷响,有人撞到了身后的矮柜。", "", ""],
|
||
["", "矮柜移开了一条缝——一道微弱的光从柜子后面漏出来。", "", ""],
|
||
["", "【插入图】矮柜后微光", "", ""],
|
||
["", "【emoji】User感叹号", "", ""],
|
||
]
|
||
|
||
wrap = Alignment(wrap_text=True, vertical="top")
|
||
for i, row_data in enumerate(rows):
|
||
for j, val in enumerate(row_data):
|
||
cell = ws.cell(row=i + 2, column=j + 1, value=val)
|
||
cell.alignment = wrap
|
||
cell.border = thin_border
|
||
if j == 0 and val:
|
||
cell.alignment = Alignment(horizontal="center", vertical="top")
|
||
if "中互动" in val:
|
||
cell.font = Font(bold=True, color="0070C0")
|
||
elif "核心互动" in val:
|
||
cell.font = Font(bold=True, color="C00000")
|
||
elif val == "TL":
|
||
cell.font = Font(bold=True, color="404040")
|
||
|
||
# 统计
|
||
stat_row = len(rows) + 3
|
||
ws.cell(row=stat_row, column=1, value="统计").font = Font(bold=True, size=12)
|
||
tl_count = sum(1 for r in rows if r[0] == "TL")
|
||
mid_count = sum(1 for r in rows if r[0] == "中互动")
|
||
core_count = sum(1 for r in rows if r[0].startswith("核心互动"))
|
||
ws.cell(row=stat_row + 1, column=1, value="总行数").font = Font(bold=True)
|
||
ws.cell(row=stat_row + 1, column=2, value=len(rows))
|
||
ws.cell(row=stat_row + 2, column=1, value="TL").font = Font(bold=True)
|
||
ws.cell(row=stat_row + 2, column=2, value=tl_count)
|
||
ws.cell(row=stat_row + 3, column=1, value="中互动").font = Font(bold=True)
|
||
ws.cell(row=stat_row + 3, column=2, value=mid_count)
|
||
ws.cell(row=stat_row + 4, column=1, value="核心互动").font = Font(bold=True)
|
||
ws.cell(row=stat_row + 4, column=2, value=core_count)
|
||
|
||
# 知识点
|
||
ws.cell(row=stat_row + 6, column=1, value="知识点覆盖").font = Font(bold=True, size=12)
|
||
kps = [
|
||
["kitchen", "May输入 \"The kitchen is full of smoke!\" + 核心互动写作"],
|
||
["kid(s)", "#3 kid #3 中互动输出 \"A kid can help!\" + 核心互动写作"],
|
||
["many", "Jay输入 \"Kids can do many things.\""],
|
||
["really", "Sue输入 \"It's really dangerous!\" + 核心互动写作"],
|
||
["There are many...", "核心互动可覆盖(写作填空可关联此句型)"],
|
||
["It's really...", "Sue回归 \"It's really dangerous!\""],
|
||
]
|
||
for i, kp in enumerate(kps):
|
||
for j, val in enumerate(kp):
|
||
ws.cell(row=stat_row + 7 + i, column=j + 1, value=val)
|
||
|
||
out = "/root/.openclaw/workspace-xiaobian/output/U24-L2_转_剧本.xlsx"
|
||
wb.save(out)
|
||
print(f"✅ {out}")
|
||
print(f" 总行数: {len(rows)} TL: {tl_count} 中互动: {mid_count} 核心互动: {core_count}")
|