import os
from bs4 import BeautifulSoup
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

# 假设您的HTML文件名为 input.html，或者你可以直接把HTML内容放在这里
html_content = """
<!DOCTYPE html>
<html lang="zh-CN">
</html>
"""

# 为了演示，我们假设您已经将上传的内容保存为了 'report.html'
# 如果没有，请将下面的 file_path 改为您实际保存 HTML 的路径
file_path = 'report.html'

def create_ppt_from_html(html_file, output_pptx):
    # 1. 读取并解析 HTML
    try:
        with open(html_file, 'r', encoding='utf-8') as f:
            soup = BeautifulSoup(f, 'html.parser')
    except FileNotFoundError:
        print(f"错误：找不到文件 {html_file}。请确保您已将HTML保存为该文件名。")
        return

    # 2. 创建 PPT 对象
    prs = Presentation()

    # 获取 HTML 中的所有 slide div
    slides_divs = soup.find_all('div', class_='slide')

    print(f"共找到 {len(slides_divs)} 张幻灯片，开始转换...")

    for index, slide_div in enumerate(slides_divs):
        classes = slide_div.get('class', [])
        
        # --- 情况 A: 封面页 (Title Slide) ---
        if 'title-slide' in classes:
            # 使用布局 0 (Title Slide)
            slide_layout = prs.slide_layouts[0]
            slide = prs.slides.add_slide(slide_layout)
            
            title = slide_div.find('h1').get_text() if slide_div.find('h1') else ""
            subtitle = slide_div.find('h2').get_text() if slide_div.find('h2') else ""
            author = slide_div.find('div', class_='author').get_text() if slide_div.find('div', class_='author') else ""
            date_text = slide_div.find('div', class_='date').get_text() if slide_div.find('div', class_='date') else ""

            slide.shapes.title.text = title
            if slide.placeholders[1]:
                slide.placeholders[1].text = f"{subtitle}\n{author}\n{date_text}"

        # --- 情况 B: 章节标题页 (Part Title) ---
        elif 'part-title' in classes:
            # 使用布局 2 (Section Header)
            slide_layout = prs.slide_layouts[2] 
            slide = prs.slides.add_slide(slide_layout)
            
            part_title = slide_div.find('h1').get_text() if slide_div.find('h1') else ""
            part_sub = slide_div.find('h2').get_text() if slide_div.find('h2') else ""
            
            slide.shapes.title.text = part_title
            if len(slide.placeholders) > 1:
                slide.placeholders[1].text = part_sub

        # --- 情况 C: 普通内容页 ---
        else:
            # 使用布局 1 (Title and Content)
            slide_layout = prs.slide_layouts[1]
            slide = prs.slides.add_slide(slide_layout)

            # 处理标题
            h1 = slide_div.find('h1')
            if h1 and slide.shapes.title:
                slide.shapes.title.text = h1.get_text()

            # 处理正文内容
            # 我们需要找到 slide-content 里的所有子元素
            content_div = slide_div.find('div', class_='slide-content')
            if not content_div:
                content_div = slide_div # 兼容某些没有 wrapper 的情况

            # 获取文本框
            tf = slide.placeholders[1].text_frame
            tf.clear() # 清除默认占位符

            # 遍历内容元素
            for element in content_div.children:
                if element.name == 'h1':
                    continue # 标题已经处理过了
                
                elif element.name == 'h2':
                    p = tf.add_paragraph()
                    p.text = element.get_text()
                    p.font.bold = True
                    p.font.size = Pt(24)
                    p.font.color.rgb = RGBColor(42, 107, 185) # 对应CSS中的蓝色
                    p.space_before = Pt(12)

                elif element.name == 'h3':
                    p = tf.add_paragraph()
                    p.text = element.get_text()
                    p.font.bold = True
                    p.font.size = Pt(20)
                    p.space_before = Pt(10)

                elif element.name == 'p':
                    p = tf.add_paragraph()
                    p.text = element.get_text()
                    p.font.size = Pt(18)
                    p.space_after = Pt(10)
                    
                    # 处理 "highlight-box" (高亮框)
                    if element.parent.get('class') and 'highlight-box' in element.parent.get('class'):
                        p.font.color.rgb = RGBColor(0, 0, 0)
                        p.font.italic = True

                elif element.name in ['ul', 'ol']:
                    for li in element.find_all('li'):
                        p = tf.add_paragraph()
                        p.text = li.get_text()
                        p.level = 1 # 设置缩进级别
                        p.font.size = Pt(18)

                elif element.name == 'div' and 'image-container' in element.get('class', []):
                    # 处理图片占位
                    img_tag = element.find('img')
                    caption = element.find('div', class_='image-caption')
                    caption_text = caption.get_text() if caption else "图片"
                    
                    if img_tag:
                        src = img_tag.get('src')
                        p = tf.add_paragraph()
                        p.text = f"[在此处插入图片: {src} - {caption_text}]"
                        p.font.italic = True
                        p.font.color.rgb = RGBColor(255, 0, 0)
                        p.alignment = PP_ALIGN.CENTER

    # 3. 保存文件
    prs.save(output_pptx)
    print(f"转换成功！文件已保存为: {output_pptx}")

# --- 执行转换 ---
# 1. 请先将您的 HTML 内容保存为 '张春华3.html'
# 2. 确保同一目录下有 1.png, 2.png 等图片（如果有的话，没有则会显示文字提示）
if __name__ == "__main__":
    # 假设您已经把那个HTML内容保存到了当前目录的 '张春华3.html'
    create_ppt_from_html('汤小艳PPT.html', '汤小艳.pptx')