bvd757 commited on
Commit
7af81f3
·
1 Parent(s): 62121f7
Files changed (1) hide show
  1. app.py +73 -95
app.py CHANGED
@@ -7,29 +7,23 @@ import html
7
 
8
  is_java_installed = False
9
 
10
-
11
  def install_java():
12
  global is_java_installed
13
  if is_java_installed: return
14
  try:
15
- # Устанавливаем OpenJDK 17
16
  subprocess.run(["apt-get", "update"], check=True)
17
  subprocess.run(["apt-get", "install", "-y", "openjdk-17-jdk"], check=True)
18
- #st.success("Java 17 установлена!")
19
  is_java_installed = True
20
  except Exception as e:
21
  st.error(f"Ошибка установки Java: {e}")
22
 
23
-
24
  @st.cache_resource
25
  def load_assets():
26
- openai.api_key = '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'
27
  install_java()
28
- tool = language_tool_python.LanguageTool('ru-RU',
29
- language_tool_download_version="6.1")
30
  return tool
31
 
32
-
33
  def generate_gpt_comment(message, context):
34
  response = openai.ChatCompletion.create(
35
  model="gpt-4o",
@@ -39,7 +33,6 @@ def generate_gpt_comment(message, context):
39
  )
40
  return response.choices[0].message['content']
41
 
42
-
43
  def check_text(text, tool):
44
  matches = tool.check(text)
45
  errors = []
@@ -52,111 +45,96 @@ def check_text(text, tool):
52
  errors.append(error_info)
53
  return errors
54
 
55
-
56
  def main():
57
  st.markdown("""
58
  <style>
59
- /* Сохраняем белый текст для темной темы */
60
- .stApp, .stTextInput, .stTextArea, .stMarkdown {
61
- color: white;
62
- }
63
-
64
- /* Специальный стиль для текста внутри выделенных ошибок */
65
  .error-highlight {
66
  background-color: #ffe066;
67
  border-bottom: 2px dotted #ff9900;
68
- position: relative;
69
- color: black !important;
70
  cursor: pointer;
 
71
  }
72
-
73
- /* Стиль для контейнера с результатом */
74
- .result-container {
75
- background: rgba(255, 255, 255, 0.1);
76
- padding: 20px;
77
- border-radius: 8px;
78
- border: 1px solid #444;
79
- white-space: pre-wrap;
80
- font-family: monospace;
81
  }
82
  </style>
83
  """, unsafe_allow_html=True)
84
 
85
  st.title('Проверка орфографии')
86
- text = st.text_area("Введите текст для проверки:", height=200).replace("\n", " ")
 
 
 
 
 
87
  tool = load_assets()
88
 
89
- # Создаем контейнер для всплывающих сообщений
90
- popup_container = st.empty()
91
-
92
  if st.button('Проверить текст'):
 
93
  if not text.strip():
94
  st.warning("Введите текст для проверки")
95
  else:
96
  errors = check_text(text, tool)
97
-
98
- if not errors:
99
- st.success("Ошибок не найдено! 👍")
100
- else:
101
- sorted_errors = sorted(errors, key=lambda x: x['start'])
102
-
103
- highlighted = []
104
- last_pos = 0
105
-
106
- for i, error in enumerate(sorted_errors):
107
- highlighted.append(html.escape(text[last_pos:error['start']]))
108
-
109
- # Добавляем обработчик клика с уникальным ID для каждой ошибки
110
- highlighted.append(
111
- f'<span class="error-highlight" onclick="showError({i})" '
112
- f'id="error-{i}" title="{html.escape(error["message"])}">'
113
- f'{html.escape(text[error["start"]:error["end"]])}'
114
- f'</span>'
115
- )
116
-
117
- last_pos = error['end']
118
-
119
- highlighted.append(html.escape(text[last_pos:]))
120
-
121
- html_content = f"""
122
- <div style="
123
- background: white;
124
- padding: 20px;
125
- border-radius: 8px;
126
- border: 1px solid #ddd;
127
- white-space: pre-wrap;
128
- font-family: monospace;
129
- color: #000000;
130
- ">
131
- {''.join(highlighted)}
132
- </div>
133
-
134
- <script>
135
- function showError(errorIndex) {{
136
- // Отправляем сообщение в Streamlit с индексом ошибки
137
- window.parent.postMessage({{
138
- type: 'streamlit:component',
139
- component: 'error_click',
140
- data: errorIndex
141
- }}, '*');
142
- }}
143
- </script>
144
- """
145
-
146
- st.markdown("### Результат проверки:")
147
- st.markdown(html_content, unsafe_allow_html=True)
148
-
149
- # Сохраняем ошибки в session_state для доступа из обработчика
150
- st.session_state.errors = errors
151
-
152
- # Обработчик кликов по ошибкам
153
- if 'errors' in st.session_state:
154
- clicked_error = st.experimental_get_query_params().get("error_click")
155
- if clicked_error:
156
- error_index = int(clicked_error[0])
157
- error = st.session_state.errors[error_index]
158
- st.warning(f"Ошибка: {error['message']}")
159
-
160
 
161
  if __name__ == "__main__":
162
- main()
 
7
 
8
  is_java_installed = False
9
 
 
10
  def install_java():
11
  global is_java_installed
12
  if is_java_installed: return
13
  try:
 
14
  subprocess.run(["apt-get", "update"], check=True)
15
  subprocess.run(["apt-get", "install", "-y", "openjdk-17-jdk"], check=True)
 
16
  is_java_installed = True
17
  except Exception as e:
18
  st.error(f"Ошибка установки Java: {e}")
19
 
 
20
  @st.cache_resource
21
  def load_assets():
22
+ openai.api_key = 'sk-proj-...' # Ваш API-ключ
23
  install_java()
24
+ tool = language_tool_python.LanguageTool('ru-RU', language_tool_download_version="6.1")
 
25
  return tool
26
 
 
27
  def generate_gpt_comment(message, context):
28
  response = openai.ChatCompletion.create(
29
  model="gpt-4o",
 
33
  )
34
  return response.choices[0].message['content']
35
 
 
36
  def check_text(text, tool):
37
  matches = tool.check(text)
38
  errors = []
 
45
  errors.append(error_info)
46
  return errors
47
 
 
48
  def main():
49
  st.markdown("""
50
  <style>
 
 
 
 
 
 
51
  .error-highlight {
52
  background-color: #ffe066;
53
  border-bottom: 2px dotted #ff9900;
 
 
54
  cursor: pointer;
55
+ color: black !important;
56
  }
57
+ .error-highlight:hover {
58
+ background-color: #ffd700;
 
 
 
 
 
 
 
59
  }
60
  </style>
61
  """, unsafe_allow_html=True)
62
 
63
  st.title('Проверка орфографии')
64
+
65
+ # Сохраняем текст в session_state
66
+ text_input = st.text_area("Введите текст для проверки:",
67
+ value=st.session_state.get('text_to_check', ''),
68
+ height=200)
69
+ text = text_input.replace("\n", " ")
70
  tool = load_assets()
71
 
 
 
 
72
  if st.button('Проверить текст'):
73
+ st.session_state.text_to_check = text_input
74
  if not text.strip():
75
  st.warning("Введите текст для проверки")
76
  else:
77
  errors = check_text(text, tool)
78
+ st.session_state.errors = errors
79
+ st.session_state.sorted_errors = sorted(errors, key=lambda x: x['start'])
80
+ st.query_params.clear() # Очищаем параметры URL
81
+
82
+ # Используем сохраненные ошибки при наличии
83
+ errors = st.session_state.get('errors', [])
84
+ sorted_errors = st.session_state.get('sorted_errors', [])
85
+
86
+ if errors:
87
+ # Генерация HTML с кликабельными ошибками
88
+ highlighted = []
89
+ last_pos = 0
90
+
91
+ for index, error in enumerate(sorted_errors):
92
+ highlighted.append(html.escape(text[last_pos:error['start']]))
93
+ highlighted.append(
94
+ f'<a href="?selected_error={index}" style="text-decoration: none; color: inherit;">'
95
+ f'<span class="error-highlight" title="{html.escape(error["message"])}">'
96
+ f'{html.escape(text[error["start"]:error["end"]])}'
97
+ f'</span></a>'
98
+ )
99
+ last_pos = error['end']
100
+
101
+ highlighted.append(html.escape(text[last_pos:]))
102
+
103
+ html_content = f"""
104
+ <div style="
105
+ background: white;
106
+ padding: 20px;
107
+ border-radius: 8px;
108
+ border: 1px solid #ddd;
109
+ white-space: pre-wrap;
110
+ font-family: monospace;
111
+ color: #000000;
112
+ ">
113
+ {''.join(highlighted)}
114
+ </div>
115
+ """
116
+
117
+ st.markdown("### Результат проверки:")
118
+ st.markdown(html_content, unsafe_allow_html=True)
119
+
120
+ # Обработка выбранной ошибки
121
+ selected_error = st.query_params.get("selected_error", None)
122
+
123
+ if selected_error is not None:
124
+ try:
125
+ selected_index = int(selected_error)
126
+ if 0 <= selected_index < len(sorted_errors):
127
+ error = sorted_errors[selected_index]
128
+ st.markdown("### Описание ошибки:")
129
+ st.markdown(f"**Ошибка {selected_index + 1}** (позиция {error['start']}-{error['end']}): {error['message']}")
130
+ return # Прекращаем выполнение, чтобы не показывать все ошибки
131
+ except:
132
+ pass
133
+
134
+ # Показываем все ошибки, если не выбрана конкретная
135
+ st.markdown("### Найденные ошибки:")
136
+ for i, error in enumerate(sorted_errors, 1):
137
+ st.markdown(f"{i}. **Позиция {error['start']}-{error['end']}**: {error['message']}")
 
 
 
138
 
139
  if __name__ == "__main__":
140
+ main()