File size: 4,274 Bytes
d95e487
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import markdown
import time  # For small delay in streaming view
import view
import model


def click_generate_btn(props):
    (
        uploaded_template_file,
        uploaded_reference_file,
        user_instructions,
        generate_button_clicked,
    ) = props
    if generate_button_clicked:
        # 새 결과 생성 시 이전 세션 값 초기화
        view.st.session_state.pop("last_result_md", None)
        view.st.session_state.pop("last_docx_data", None)

        # 1. 입력 유효성 검사
        if not uploaded_template_file:
            view.display_warning("PDF 서식 파일을 업로드하세요.")
        elif not user_instructions:
            view.display_warning("작성 지시사항을 입력하세요.")
        else:
            # 2. PDF 텍스트 추출
            template_text = model.extract_text_from_pdf(uploaded_template_file)
            reference_text = model.extract_text_from_pdf(
                uploaded_reference_file
            )  # Returns None if no file

            if not template_text:
                view.display_warning(
                    "PDF 서식 파일에서 텍스트를 추출하지 못했습니다. 파일 내용을 확인해주세요."
                )
            else:
                # 3. 결과 영역 준비
                results_container, results_placeholder = view.display_results_area()

                # 4. 콘텐츠 생성 (스트리밍) 및 표시
                full_response_md = ""
                error_occurred = False
                try:
                    with view.display_spinner("보고서/계획서 생성 중..."):
                        for chunk in model.generate_content_from_gemini(
                            template_text, reference_text, user_instructions
                        ):
                            full_response_md += chunk
                            view.update_results_stream(
                                results_placeholder, full_response_md
                            )
                            time.sleep(0.01)

                        if "오류 발생:" in full_response_md:
                            error_occurred = True

                    # ✅ 결과 저장
                    view.st.session_state["last_result_md"] = full_response_md

                except Exception as e:
                    error_occurred = True
                    view.display_error(f"콘텐츠 생성 중 심각한 오류 발생: {e}")
                    full_response_md = f"오류: {e}"

                # 5. 최종 결과 처리 및 DOCX 생성/다운로드 버튼 표시
                if not error_occurred and full_response_md:
                    final_html = markdown.markdown(
                        full_response_md, extensions=["tables", "fenced_code"]
                    )
                    view.display_final_result(results_placeholder, final_html)

                    title, docx_data = model.markdown_to_docx(full_response_md)
                    if docx_data:
                        # 결과는 유지하면서 다운로드 버튼 표시
                        view.st.session_state["last_docx_data"] = docx_data
                        view.display_download_button(title, docx_data)
                    else:
                        view.display_warning("결과를 DOCX로 변환하는 데 실패했습니다.")

                # 결과 복원
                # if (
                #     "last_result_md" in view.st.session_state
                #     and not generate_button_clicked
                # ):
                #     prev_html = markdown.markdown(
                #         view.st.session_state["last_result_md"],
                #         extensions=["tables", "fenced_code"],
                #     )
                #     results_container, result_placeholder = view.display_results_area()
                #     view.display_final_result(result_placeholder, prev_html)

                #     if "last_docx_data" in view.st.session_state:
                #         view.display_download_button(
                #             results_container,
                #             view.st.session_state["last_docx_data"],
                #             key="download_button_restored",
                #         )