zenivan commited on
Commit
bcb59a4
·
1 Parent(s): cb46ed4
Files changed (3) hide show
  1. app/test_gradio_test.py +82 -21
  2. requirements +1 -1
  3. requirements.txt +0 -1
app/test_gradio_test.py CHANGED
@@ -13,7 +13,9 @@ import random
13
  from app.quotes import quotes
14
  from app.drawings import drawings
15
  from app.knowledge_base.textbooks import TEXTBOOKS
16
- # --- Настройка ---
 
 
17
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
18
  load_dotenv()
19
  api_key = os.getenv("API_KEY_openai")
@@ -21,7 +23,7 @@ client = OpenAI(api_key=api_key) if api_key else None
21
  VS_ID = os.getenv("VECTOR_STORE_ID", "") # vector store for file_search if needed
22
 
23
 
24
- ###### УТИЛИТЫ
25
  def upload_to_catbox(file_bytes: bytes) -> str:
26
  """Загружает файл на catbox.moe и возвращает URL"""
27
  try:
@@ -38,29 +40,88 @@ def upload_to_catbox(file_bytes: bytes) -> str:
38
  raise gr.Error("Не удалось загрузить изображение")
39
 
40
 
41
- import subprocess
 
42
 
43
- def generate_docx(markdown_text: str) -> str:
44
- """Конвертирует markdown-текст в .docx через pandoc и возвращает путь к файлу."""
45
- tmp_dir = tempfile.gettempdir()
46
- md_path = os.path.join(tmp_dir, "lesson_plan.md")
47
- docx_path = os.path.join(tmp_dir, f"lesson_plan_{datetime.now().strftime('%Y%m%d%H%M%S')}.docx")
 
 
48
 
49
- # Сохраняем markdown во временный .md файл
50
- with open(md_path, "w", encoding="utf-8") as f:
51
- f.write(markdown_text)
52
 
53
- try:
54
- # Запускаем pandoc для конвертации в docx
55
- subprocess.run(
56
- ["pandoc", md_path, "-o", docx_path],
57
- check=True
58
- )
59
- return docx_path
60
- except subprocess.CalledProcessError as e:
61
- logging.error(f"Ошибка Pandoc: {e}")
62
- raise gr.Error("Ошибка при конвертации в DOCX через Pandoc")
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
  # названия textbooks для автозаполнения поля Учебник
66
  import json
 
13
  from app.quotes import quotes
14
  from app.drawings import drawings
15
  from app.knowledge_base.textbooks import TEXTBOOKS
16
+
17
+
18
+ # НАСТРОЙКА
19
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
20
  load_dotenv()
21
  api_key = os.getenv("API_KEY_openai")
 
23
  VS_ID = os.getenv("VECTOR_STORE_ID", "") # vector store for file_search if needed
24
 
25
 
26
+ #### УТИЛИТЫ
27
  def upload_to_catbox(file_bytes: bytes) -> str:
28
  """Загружает файл на catbox.moe и возвращает URL"""
29
  try:
 
40
  raise gr.Error("Не удалось загрузить изображение")
41
 
42
 
43
+ from docx.shared import Pt
44
+ import re
45
 
46
+ def generate_docx(text: str) -> str:
47
+ """Сохраняет текст с таблицами в .docx и возвращает путь"""
48
+ doc = Document()
49
+ in_table = False
50
+ table_rows = []
51
+ header = []
52
+ separator = []
53
 
54
+ for line in text.split("\n"):
55
+ line = line.strip()
 
56
 
57
+ # Определяем строки таблицы
58
+ if re.match(r'^\|.+\|$', line):
59
+ if not in_table:
60
+ in_table = True
 
 
 
 
 
 
61
 
62
+ # Очищаем и разделяем ячейки
63
+ cells = [cell.strip() for cell in line[1:-1].split('|')]
64
+
65
+ # Определяем тип строки: заголовок, разделитель или данные
66
+ if all(re.match(r'^:?-+:?$', cell) for cell in cells):
67
+ separator = cells
68
+ elif header:
69
+ table_rows.append(cells)
70
+ else:
71
+ header = cells
72
+
73
+ else:
74
+ if in_table:
75
+ # Создаем таблицу когда выходим из блока таблицы
76
+ if header and separator and table_rows:
77
+ cols = len(header)
78
+ table = doc.add_table(rows=1, cols=cols)
79
+ table.style = 'Table Grid'
80
+
81
+ # Заголовок
82
+ hdr_row = table.rows[0]
83
+ for i, cell_text in enumerate(header):
84
+ hdr_row.cells[i].text = cell_text
85
+ hdr_row.cells[i].paragraphs[0].runs[0].font.bold = True
86
+
87
+ # Данные
88
+ for row in table_rows:
89
+ new_row = table.add_row()
90
+ for i, cell_text in enumerate(row[:cols]): # Обрезаем лишние ячейки
91
+ new_row.cells[i].text = cell_text
92
+
93
+ # Сбрасываем состояние
94
+ in_table = False
95
+ header = []
96
+ separator = []
97
+ table_rows = []
98
+
99
+ # Добавляем обычный текст
100
+ if line:
101
+ p = doc.add_paragraph(line)
102
+ p.style = 'BodyText'
103
+
104
+ # Обрабатываем таблицу в конце текста
105
+ if in_table and header and table_rows:
106
+ cols = len(header)
107
+ table = doc.add_table(rows=1, cols=cols)
108
+ table.style = 'Table Grid'
109
+
110
+ hdr_row = table.rows[0]
111
+ for i, cell_text in enumerate(header):
112
+ hdr_row.cells[i].text = cell_text
113
+ hdr_row.cells[i].paragraphs[0].runs[0].font.bold = True
114
+
115
+ for row in table_rows:
116
+ new_row = table.add_row()
117
+ for i, cell_text in enumerate(row[:cols]):
118
+ new_row.cells[i].text = cell_text
119
+
120
+ # Сохраняем документ
121
+ tmp = tempfile.gettempdir()
122
+ path = os.path.join(tmp, f"lesson_plan_{datetime.now().strftime('%Y%m%d%H%M%S')}.docx")
123
+ doc.save(path)
124
+ return path
125
 
126
  # названия textbooks для автозаполнения поля Учебник
127
  import json
requirements CHANGED
@@ -2,7 +2,7 @@ streamlit
2
  python-dotenv
3
  python-docx
4
  openai
5
-
6
 
7
 
8
 
 
2
  python-dotenv
3
  python-docx
4
  openai
5
+ markdown
6
 
7
 
8
 
requirements.txt CHANGED
@@ -1,6 +1,5 @@
1
  python-dotenv
2
  python-docx
3
- pandoc
4
  openai
5
  gradio
6
  requests
 
1
  python-dotenv
2
  python-docx
 
3
  openai
4
  gradio
5
  requests