skills/ppt-station-skill/ppt_station/composer/layouts/title.py

100 lines
3.3 KiB
Python
Raw Permalink Normal View History

"""标题页布局"""
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from ..helpers import set_slide_bg, add_text, add_line, add_rect
def layout_title_dark(slide, data, theme):
"""深色标题页 — 大标题 + 副标题 + 日期 + 底部装饰线
data keys:
title (str): 主标题
subtitle (str, optional): 副标题
date (str, optional): 日期
author (str, optional): 作者
"""
m = theme["margin"]
sw = theme.get("slide_w", 13.333)
sh = theme.get("slide_h", 7.5)
cover_title_size = theme.get("cover_title_size", 36)
# 深色背景
set_slide_bg(slide, theme["bg_dark"])
# 顶部装饰线
add_rect(slide, 0, 0, sw, 0.06, fill=theme["accent"])
# 主标题
add_text(slide, data["title"],
x=m, y=2.2, w=sw - 2 * m, h=1.8,
font_size=cover_title_size, color=theme["text_light"],
bold=True, align="center", valign="middle",
font_name=theme["header_font"])
# 副标题
if data.get("subtitle"):
add_text(slide, data["subtitle"],
x=m, y=4.2, w=sw - 2 * m, h=0.8,
font_size=theme["subtitle_size"], color=theme["secondary"],
align="center", font_name=theme["body_font"])
# 底部信息栏
bottom_parts = []
if data.get("author"):
bottom_parts.append(data["author"])
if data.get("date"):
bottom_parts.append(data["date"])
if bottom_parts:
footer_size = theme.get("footer_size", 8)
add_text(slide, " | ".join(bottom_parts),
x=m, y=sh - 1.2, w=sw - 2 * m, h=0.5,
font_size=footer_size + 2, color=theme["text_muted"],
align="center", font_name=theme["body_font"])
# 底部装饰线
add_rect(slide, 0, sh - 0.06, sw, 0.06, fill=theme["accent"])
def layout_title_light(slide, data, theme):
"""浅色标题页 — 左侧色块 + 右侧标题
data keys:
title (str): 主标题
subtitle (str, optional): 副标题
date (str, optional): 日期
"""
m = theme["margin"]
sw = theme.get("slide_w", 13.333)
sh = theme.get("slide_h", 7.5)
cover_title_size = theme.get("cover_title_size", 36)
set_slide_bg(slide, theme["bg_light"])
# 左侧色块(比例化)
block_w = sw * 0.34
add_rect(slide, 0, 0, block_w, sh, fill=theme["primary"])
# 左侧标题(白色)
add_text(slide, data["title"],
x=0.5, y=2.5, w=block_w - 1.0, h=2.5,
font_size=cover_title_size - 8, color=theme["text_light"],
bold=True, align="left", font_name=theme["header_font"])
# 右侧副标题
right_x = block_w + 1.0
right_w = sw - right_x - m
if data.get("subtitle"):
add_text(slide, data["subtitle"],
x=right_x, y=2.8, w=right_w, h=1.5,
font_size=theme["subtitle_size"], color=theme["text_dark"],
align="left", font_name=theme["body_font"])
# 日期
if data.get("date"):
footer_size = theme.get("footer_size", 8)
add_text(slide, data["date"],
x=right_x, y=4.5, w=right_w, h=0.5,
font_size=footer_size + 2, color=theme["text_muted"],
align="left", font_name=theme["body_font"])