# pip install python-pptx

import os
import sys
from pptx import Presentation

# 現在のディレクトリ
root_dir = "."
# 出力ファイルのパス
output_path = "extracted_pptx_text.txt"
# 検索するディレクトリの最大深度 (-1は無制限)
max_level = -1

# コマンドライン引数の解析
# python script.py [root_dir] [output_path] [max_level]
if len(sys.argv) > 1:
    root_dir = sys.argv[1]
if len(sys.argv) > 2:
    output_path = sys.argv[2]
if len(sys.argv) > 3:
    max_level = sys.argv[3]
try:
    max_level = int(max_level)
except ValueError:
    print(f"エラー: 無効なmax_level '{max_level}'です。")
    sys.exit(1) # exit() の代わりに sys.exit() を使用

def pptx_text_generator(pptx_path, mode="paragraph"):
    """
    指定されたPowerPointファイルからテキストを抽出し、スライドごとにジェネレータとしてyieldする。

    Args:
        pptx_path (str): PowerPointファイルのパス。
        mode (str): 'paragraph' (段落ごと) または 'run' (テキストランごと) でテキストを抽出。

    Yields:
        dict: 抽出されたスライドのテキスト情報を含む辞書。
              キー: 'pptx_path', 'slide_number', 'slide_title', 'slide_text'
    """
    try:
        prs = Presentation(pptx_path)

        for i, slide in enumerate(prs.slides):
            slide_text_parts = []

            # 1. スライドタイトルを最初に抽出
            slide_title_text = ""
            if slide.shapes.title:  # 標準のタイトルプレースホルダーがあるか確認
                slide_title_text = slide.shapes.title.text_frame.text.strip()

            # 2. その他のテキストを抽出
            for shape in slide.shapes:
                if hasattr(shape, "text_frame") and shape.text_frame:
                    for paragraph in shape.text_frame.paragraphs:
                        if mode == 'paragraph':
                            # 空の段落はスキップ
                            if paragraph.text.strip():
                                slide_text_parts.append(paragraph.text.strip())
                        else:
                            for run in paragraph.runs:
                                if run.text.strip():
                                    slide_text_parts.append(run.text.strip())

            # 抽出されたテキストを結合
            combined_slide_text = "\n".join(slide_text_parts)

            # ジェネレータとして情報をyield
            yield {
                'pptx_path': pptx_path,
                'slide_number': i + 1,
                'slide_title': slide_title_text,
                'slide_text': combined_slide_text
            }

    except Exception as e:
        print(f"エラー: {pptx_path}の処理中にエラーが発生しました: {e}", file=sys.stderr) # エラーメッセージをstderrに出力

def search_pptx_and_extract(root_dir, output_path, max_level=-1):
    """
    指定されたディレクトリからPowerPointファイルを再帰的に検索し、
    ジェネレータを使用してテキストを抽出し、出力ファイルに書き込む。
    """
    if not os.path.isdir(root_dir):
        print(f"エラー: ルートディレクトリ '{root_dir}' は存在しません。")
        return

    print(f"'{root_dir}' 内の .pptx ファイルを検索中 (最大深度: {max_level})...")

    with open(output_path, 'w', encoding='utf-8') as outfile:
        for dirpath, dirnames, filenames in os.walk(root_dir):
            # 現在のディレクトリの深さを計算
            # os.sep はOSごとのパス区切り文字 (例: Windowsでは'\\', Unixでは'/')
            current_level = dirpath.count(os.sep) - root_dir.count(os.sep)

            if max_level != -1 and current_level >= max_level:
                # 指定された深さ制限を超えた場合、このブランチはスキップ
                del dirnames[:]  # これにより、os.walkがこのディレクトリの下に進まないようにする
                continue

            for filename in filenames:
                if filename.endswith(".pptx"):
                    pptx_full_path = os.path.join(dirpath, filename)
                    print(f"  処理中: {pptx_full_path}")

                    # ジェネレータからテキストを取得し、ファイルに書き込む
                    for slide_info in pptx_text_generator(pptx_full_path):
                        outfile.write(f"{slide_info['pptx_path']}\n")
                        if slide_info['slide_title']:
                            outfile.write(f"Slide {slide_info['slide_number']}: {slide_info['slide_title'].replace('\n', ' ')}\n")
                        else:
                            outfile.write(f"Slide {slide_info['slide_number']}:\n")

                        if slide_info['slide_text'].strip():
                            outfile.write(slide_info['slide_text'].strip() + "\n\n")
                        else:
                            outfile.write("(テキストが見つかりませんでした)\n\n")

if __name__ == "__main__":
    search_pptx_and_extract(root_dir, output_path, max_level)
    print(f"\nテキスト抽出が完了しました。出力は '{output_path}' に保存されました。")
    input("\n終了するにはENTERキーを押してください>>")
