========== 새로고침되어 다시 ==========

### 추출이 곤란한 복잡한 mht 파일의 구조 ###
(허깅페이스 스페이스의 채팅 앱과의 대화내용을 저장한 mht 문서인데, 어느 대학 연구소로 대화내용을 보내게 되어 있어, 그런 메세지를 띄우는 부분과, 대화내용을 보내는 부분 그리고 Gradio 등등으로 복잡해져 있음. 95% 정도가 그런 알 수 없는 내용들) 
(사용자가 쓴 대화의 내용에 HTML 문서 또는 HTML 태그 이름이 들어간 코드들이 많아 같거나 비슷한 태그들이 반복되므로 짝을 못찾아 짤리는데 AI들도 해결 못했음. 사실  그럴 경우에는 시작부분과 끝부분을 구별 가능한 것으로 정확히 제공하라는 메세지를 띄우면 되는 거였음.)

...

<!DOCTYPE html> ... </html>

...

<!DOCTYPE html> ... </html>

...

<!DOCTYPE html><html lang="ko">
...

<...<button ... aria-label="user's message: 허깅페이스 스페이스에 다음의 app.py로 앱을 만들었는데, 다운로드 받을 때 ... html 태그들이 포함된 대화 ... demo.launch()" class="..." style="...">
  <span class="md ... chatbot prose"><p>허깅페이스 스페이스에 다음의 app.py로 앱을 만들었는데, 다운로드 받을 때 ... html 태그들이 포함된 대화 ... <pre><code>...demo.launch()</code></pre>
  </span>
</button>...>

<...<button ... aria-label="bot's message: 안녕하세요! ... html 태그들이 포함된 대화 ... 추가 도움이 필요하시면 언제든지 말씀해주세요!" class="..." style="...">
  <span class="md ... chatbot prose"><p>안녕하세요!</p> ... html 태그들이 포함된 대화 ... <p>추가 도움이 필요하시면 언제든지 말씀해주세요!</p>
  </span>
</button>...>

...

</html>

...

<!DOCTYPE html> ... </html>

...

========== 
==========

아무튼 아무리 해도 안됐었고, 생각해보니 필요할 경우에는 시작부분과 끝부분을 **구별되는 코드로** 정확히 입력하라는 메세지를 띄우면 되는 거였어요.

도저히 구별될 수 없는 거라면 사용자가 임의 문자를 삽입해서 업로드하라는 식으로 추가적인 팁을 페이지 하단에 다시 한번 제공하면 거고요

실제로는 사용자 없이 어떤 앱에서 자동적으로 mht 문서를 다른 여러 문서로 바꾸거나 추출 편집해주는 것을 개발하려는 개발자들이나 고심하며 복잡한 파일들을 구성할 필요가 있을 것 같고요.

제대로 작동이 안되는 CSS와 Script들을 제거하고 기본 스타일이나 사용자 제공한 내용으로 바꾸어 준다든가 하는 정도는 사용자들에게 필요할 수도 있고요.

비공개적으로 그런 앱들을 스페이스에 만들어 놓은 사람들도 있을 거고요.

아무튼 다시 시작한다는 뜻에서, 첫번째라고 할 코드를 보낼게요. 개선해주세요.

==========

import gradio as gr
import re
import tempfile

def extract_html_from_mht(mht_content, choice="<!DOCTYPE html><html lang=", occurrence='1'):
    # 정규 표현식을 통해 모두 HTML 문서 추출
    if choice == "<!DOCTYPE html><html":
        pattern = r'<!DOCTYPE html><html.*?</html>'
    elif choice == "<!DOCTYPE html><html lang=":
        pattern = r'<!DOCTYPE html><html lang=".*?".*?</html>'
    else:
        return ("Invalid choice.", None)

    matches = re.finditer(pattern, mht_content, re.DOTALL)

    # 모든 매치 저장
    matches_list = list(matches)

    if matches_list:
        # occurrence에 기반하여 특정 HTML 문서 선택
        try:
            index = int(occurrence) - 1
            if index >= 0 and index < len(matches_list):
                html_content = matches_list[index].group(0)
            else:
                return ("Invalid occurrence number.", None)
        except ValueError:
            return ("Occurrence must be a number.", None)
        
        # 임시 파일 생성
        with tempfile.NamedTemporaryFile(delete=False, suffix=".html") as temp_file:
            temp_file.write(html_content.encode('utf-8'))
            temp_file_path = temp_file.name
        
        # 임시 파일의 경로 반환
        return temp_file_path
    else:
        # HTML 문서가 없으면 에러 메시지 반환
        return ("No valid HTML content found in the MHT file.", None)

with gr.Blocks() as block:
    gr.Markdown("<h4>This App lets you choose the HTML tag pattern to extract from MHT content.</h4>")
    
    mht_input = gr.Textbox(label="Paste your MHT content here", lines=20, placeholder="MHT 파일의 내용을 여기에 붙여넣기")
    choice_dropdown = gr.Dropdown(label="Choose HTML start pattern", choices=["<!DOCTYPE html><html", "<!DOCTYPE html><html lang="])
    occurrence_input = gr.Textbox(label="Enter which occurrence to extract (number)", value="1")
    convert_button = gr.Button("Extract HTML from MHT")
    download_output = gr.File(label="Download HTML File")
    
    convert_button.click(fn=extract_html_from_mht, inputs=[mht_input, choice_dropdown, occurrence_input], outputs=download_output)
    
block.launch()