skills/ppt-station-skill/ppt_station/composer/layouts/title.py
wangyitong a65adcc2e5 Initial commit: merged, deduplicated, and vetted skill collection
Sources: extracted from two upstream archives (skill-repo, skills-main),
merged with the following policy:

- 15 broken symlinks (pointing to /Users/jameslee/.cc-switch/skills or
  ../../.agents/skills on a foreign machine) discarded
- 3 real name collisions with identical content (ai-pair, ifind-http-api,
  zhipu-websearch) kept as one copy
- Functional overlaps deduped keeping the strongest variant:
  - docx family: kept docx (official, full toolchain) + docx-cn
    (GB/T 9704 Chinese official-document constants),
    dropped docx_writer (no scripts, name collided with docx)
  - humanizer family: kept humanizer-zh (6 zh reference docs),
    dropped humanizer (en, redundant for CN workflow)
- Skills that only ran in a foreign environment removed:
  ablemind-ops, app-publish, hlb-design-system, openclaw-adj-skill,
  claude-driver
- alphapai excluded from this public repo because its SKILL.md hard-coded
  live credentials

Result: 25 skills, 572 files, ~7.5 MB.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 14:47:12 +08:00

100 lines
3.3 KiB
Python

"""标题页布局"""
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"])