Update app.py
Browse files
app.py
CHANGED
@@ -558,50 +558,16 @@ def process_font_file(file):
|
|
558 |
def create_app():
|
559 |
with gr.Blocks(
|
560 |
title="한국어 폰트 라이선스 분석기",
|
561 |
-
theme=gr.themes.Soft()
|
562 |
-
css="""
|
563 |
-
.main-header {
|
564 |
-
text-align: center;
|
565 |
-
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
|
566 |
-
color: white;
|
567 |
-
padding: 2rem;
|
568 |
-
border-radius: 10px;
|
569 |
-
margin-bottom: 2rem;
|
570 |
-
}
|
571 |
-
.upload-area {
|
572 |
-
border: 2px dashed #4CAF50;
|
573 |
-
border-radius: 10px;
|
574 |
-
padding: 20px;
|
575 |
-
text-align: center;
|
576 |
-
margin: 10px 0;
|
577 |
-
background: #f8f9fa;
|
578 |
-
}
|
579 |
-
.result-summary {
|
580 |
-
background: #e8f5e8;
|
581 |
-
border-left: 4px solid #28a745;
|
582 |
-
padding: 15px;
|
583 |
-
margin: 10px 0;
|
584 |
-
border-radius: 5px;
|
585 |
-
}
|
586 |
-
.cmd-example {
|
587 |
-
background: #2d3748;
|
588 |
-
color: #e2e8f0;
|
589 |
-
padding: 15px;
|
590 |
-
border-radius: 5px;
|
591 |
-
font-family: 'Courier New', monospace;
|
592 |
-
margin: 10px 0;
|
593 |
-
}
|
594 |
-
"""
|
595 |
) as app:
|
596 |
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
""")
|
605 |
|
606 |
with gr.Row():
|
607 |
with gr.Column(scale=1):
|
@@ -609,8 +575,7 @@ def create_app():
|
|
609 |
|
610 |
file_input = gr.File(
|
611 |
label="폰트 목록 텍스트 파일 (.txt)",
|
612 |
-
file_types=[".txt"]
|
613 |
-
elem_classes=["upload-area"]
|
614 |
)
|
615 |
|
616 |
analyze_btn = gr.Button(
|
@@ -619,149 +584,38 @@ def create_app():
|
|
619 |
size="lg"
|
620 |
)
|
621 |
|
622 |
-
with gr.Accordion("💡
|
623 |
gr.Markdown("""
|
624 |
-
###
|
625 |
-
- 제어판 → 글꼴에서 원하는 폰트들을 선택
|
626 |
-
- 새 폴더를 만들어 복사하여 저장 (예: C:\\MyFonts)
|
627 |
|
628 |
-
|
629 |
-
|
|
|
630 |
|
631 |
-
|
632 |
-
|
633 |
-
dir "C:\\MyFonts" /b > font_list.txt
|
634 |
-
dir "폰트폴더경로" /b > 파일명.txt
|
635 |
-
```""")
|
636 |
|
637 |
-
|
638 |
-
|
639 |
-
- 위에서 생성된 font_list.txt 파일을 업로드하세요
|
640 |
|
641 |
**📝 지원 파일 형식:**
|
642 |
- 한 줄에 하나의 폰트 파일명
|
643 |
- TTF, OTF, TTC 확장자 자동 인식
|
644 |
- UTF-8, CP949, EUC-KR 인코딩 지원
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
645 |
""")
|
646 |
|
647 |
with gr.Column(scale=2):
|
648 |
gr.Markdown("## 📊 분석 결과")
|
649 |
|
650 |
-
summary_output = gr.Markdown(
|
651 |
-
"파일을 업로드하고 '분석 시작' 버튼을 클릭하세요.",
|
652 |
-
elem_classes=["result-summary"]
|
653 |
-
)
|
654 |
|
655 |
result_table = gr.Dataframe(
|
656 |
-
headers=["원본 파일명", "폰트명", "라이선스", "상업적 사용", "출처 표시", "수정 가능",
|
657 |
-
label="폰트 라이선스 상세 정보",
|
658 |
-
wrap=True,
|
659 |
-
interactive=False,
|
660 |
-
height=400
|
661 |
-
)
|
662 |
-
|
663 |
-
excel_download = gr.File(
|
664 |
-
label="📥 엑셀 파일 다운로드",
|
665 |
-
visible=False
|
666 |
-
)
|
667 |
-
|
668 |
-
# 샘플 데이터 및 추가 정보
|
669 |
-
with gr.Accordion("📋 샘플 결과 미리보기", open=False):
|
670 |
-
sample_data = [
|
671 |
-
["NanumGothic.ttf", "나눔고딕", "SIL OFL 1.1", "✅ 가능", "불필요", "가능", "네이버", "https://hangeul.naver.com/2017/nanum", "웹폰트 사용 가능"],
|
672 |
-
["Pretendard-Regular.otf", "Pretendard", "SIL OFL 1.1", "✅ 가능", "불필요", "가능", "Kil Hyung-jin", "https://github.com/orioncactus/pretendard", "시스템 UI 최적화 폰트"],
|
673 |
-
["YoonGothic.ttf", "윤고딕", "상업적 라이선스 필요", "❌ 유료", "해당없음", "라이선스에 따라", "윤디자인그룹", "https://www.yoondesign.com", "개인 사용만 무료"],
|
674 |
-
["BMDOHYEON_ttf.ttf", "배달의민족 도현", "커스텀 무료", "✅ 가능", "불필요", "불가능", "배달의민족", "https://www.woowahan.com/fonts", "BI 제작 시 사용 금지"]
|
675 |
-
]
|
676 |
-
|
677 |
-
gr.Dataframe(
|
678 |
-
value=sample_data,
|
679 |
-
headers=["원본 파일명", "폰트명", "라이선스", "상업적 사용", "출처 표시", "수정 가능", "제공처", "제공처 URL", "비고"],
|
680 |
-
label="결과 예시"
|
681 |
-
)
|
682 |
-
|
683 |
-
with gr.Accordion("ℹ️ 라이선스 유형 설명", open=False):
|
684 |
-
gr.Markdown("""
|
685 |
-
### 주요 라이선스 유형
|
686 |
-
|
687 |
-
**✅ SIL OFL 1.1 (Open Font License)**
|
688 |
-
- 상업적 사용: 완전 자유
|
689 |
-
- 출처 표시: 불필요
|
690 |
-
- 수정/재배포: 가능
|
691 |
-
- 웹폰트 사용: 가능
|
692 |
-
|
693 |
-
**✅ 커스텀 무료 라이선스**
|
694 |
-
- 각 제작사별 고유 조건
|
695 |
-
- 대부분 상업적 사용 가능
|
696 |
-
- 일부 제한사항 존재 (BI 사용 금지 등)
|
697 |
-
|
698 |
-
**✅ 공공누리 제1유형**
|
699 |
-
- 공공기관에서 제작한 폰트
|
700 |
-
- 출처 표시 없이 자유 이용 가능
|
701 |
-
- 상업적 사용 가능
|
702 |
-
|
703 |
-
**❌ 상업적 라이선스 필요**
|
704 |
-
- 개인 사용: 무료
|
705 |
-
- 상업적 사용: 유료 라이선스 구매 필요
|
706 |
-
- 주로 전문 폰트 제작사 폰트들
|
707 |
-
|
708 |
-
**❓ 확인 필요**
|
709 |
-
- 데이터베이스에 정보가 없는 폰트
|
710 |
-
- 제작사 공식 사이트에서 직접 확인 필요
|
711 |
-
""")
|
712 |
-
|
713 |
-
gr.Markdown("""
|
714 |
-
---
|
715 |
-
|
716 |
-
### ⚠️ 중요 안내사항
|
717 |
-
|
718 |
-
- 이 도구는 참고용으로 제공되며, **법적 책임을 지지 않습니다**
|
719 |
-
- 상업적 프로젝트에 사용하기 전에는 **반드시 제작사 공식 사이트에서 최종 확인**하세요
|
720 |
-
- 폰트 라이선스는 **변경될 수 있으니** 정기적으로 확인하시기 바랍니다
|
721 |
-
- 문제가 있거나 추가하고 싶은 폰트 정보가 있으시면 이슈를 남겨주세요
|
722 |
-
|
723 |
-
### 📞 도움이 필요하시면
|
724 |
-
- GitHub Issues를 통해 문의해주세요
|
725 |
-
- 새로운 폰트 정보 제보도 환영합니다!
|
726 |
-
""")
|
727 |
-
|
728 |
-
# 이벤트 핸들러
|
729 |
-
def handle_analysis(file):
|
730 |
-
if file is None:
|
731 |
-
return "📁 파일을 업로드해주세요.", None, gr.File(visible=False)
|
732 |
-
|
733 |
-
df, summary, excel_file = process_font_file(file)
|
734 |
-
|
735 |
-
if df is None:
|
736 |
-
return summary, None, gr.File(visible=False)
|
737 |
-
|
738 |
-
if excel_file:
|
739 |
-
return summary, df, gr.File(value=excel_file, visible=True)
|
740 |
-
else:
|
741 |
-
return summary, df, gr.File(visible=False)
|
742 |
-
|
743 |
-
# 버튼 클릭 이벤트
|
744 |
-
analyze_btn.click(
|
745 |
-
fn=handle_analysis,
|
746 |
-
inputs=file_input,
|
747 |
-
outputs=[summary_output, result_table, excel_download]
|
748 |
-
)
|
749 |
-
|
750 |
-
# 파일 업로드 시 자동 분석
|
751 |
-
file_input.change(
|
752 |
-
fn=handle_analysis,
|
753 |
-
inputs=file_input,
|
754 |
-
outputs=[summary_output, result_table, excel_download]
|
755 |
-
)
|
756 |
-
|
757 |
-
return app
|
758 |
-
|
759 |
-
# 앱 실행
|
760 |
-
if __name__ == "__main__":
|
761 |
-
app = create_app()
|
762 |
-
app.launch(
|
763 |
-
server_name="0.0.0.0",
|
764 |
-
server_port=7860,
|
765 |
-
share=False,
|
766 |
-
show_error=True
|
767 |
-
)
|
|
|
558 |
def create_app():
|
559 |
with gr.Blocks(
|
560 |
title="한국어 폰트 라이선스 분석기",
|
561 |
+
theme=gr.themes.Soft()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
562 |
) as app:
|
563 |
|
564 |
+
gr.Markdown("""
|
565 |
+
# 🔍 한국어 폰트 라이선스 분석기
|
566 |
+
|
567 |
+
**폰트 목록을 업로드하면 라이선스 정보를 분석하여 엑셀로 제공합니다!**
|
568 |
+
|
569 |
+
💼 상업적 사용 가능 여부 | 📄 출처 표시 필요 여부 | ✏️ 수정/재배포 가능 여부 | 🔗 공식 다운로드 링크
|
570 |
+
""")
|
|
|
571 |
|
572 |
with gr.Row():
|
573 |
with gr.Column(scale=1):
|
|
|
575 |
|
576 |
file_input = gr.File(
|
577 |
label="폰트 목록 텍스트 파일 (.txt)",
|
578 |
+
file_types=[".txt"]
|
|
|
579 |
)
|
580 |
|
581 |
analyze_btn = gr.Button(
|
|
|
584 |
size="lg"
|
585 |
)
|
586 |
|
587 |
+
with gr.Accordion("💡 사용 방법", open=True):
|
588 |
gr.Markdown("""
|
589 |
+
### 📝 간단한 사용법
|
|
|
|
|
590 |
|
591 |
+
1. **폰트 목록 텍스트 파일 준비**
|
592 |
+
- 메모장에서 폰트 파일명을 한 줄에 하나씩 입력
|
593 |
+
- 예시: `NanumGothic.ttf`, `Pretendard-Regular.otf`
|
594 |
|
595 |
+
2. **파일 업로드**
|
596 |
+
- 위에서 만든 txt 파일을 업로드
|
|
|
|
|
|
|
597 |
|
598 |
+
3. **결과 확인 및 다운로드**
|
599 |
+
- 분석 결과를 확인하고 엑셀 파일 다운로드
|
|
|
600 |
|
601 |
**📝 지원 파일 형식:**
|
602 |
- 한 줄에 하나의 폰트 파일명
|
603 |
- TTF, OTF, TTC 확장자 자동 인식
|
604 |
- UTF-8, CP949, EUC-KR 인코딩 지원
|
605 |
+
|
606 |
+
**✨ 예시 파일 내용:**
|
607 |
+
```
|
608 |
+
NanumGothic.ttf
|
609 |
+
Pretendard-Regular.otf
|
610 |
+
BMDOHYEON_ttf.ttf
|
611 |
+
SeoulNamsan-Medium.ttf
|
612 |
+
```
|
613 |
""")
|
614 |
|
615 |
with gr.Column(scale=2):
|
616 |
gr.Markdown("## 📊 분석 결과")
|
617 |
|
618 |
+
summary_output = gr.Markdown("파일을 업로드하고 '��석 시작' 버튼을 클릭하세요.")
|
|
|
|
|
|
|
619 |
|
620 |
result_table = gr.Dataframe(
|
621 |
+
headers=["원본 파일명", "폰트명", "라이선스", "상업적 사용", "출처 표시", "수정 가능",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|