File size: 7,471 Bytes
77619f4
4dce3bb
184117d
e3c1e1d
2c0b608
a52faf6
0498a33
 
a52faf6
7bf3b1f
1fa20bd
a532349
 
1fa20bd
 
 
a532349
 
 
1fa20bd
 
 
 
 
 
 
 
 
 
a532349
 
 
1fa20bd
 
 
 
 
 
 
 
 
 
a532349
 
 
1fa20bd
a532349
1fa20bd
 
a532349
1fa20bd
7bf3b1f
184117d
e3c1e1d
41c1169
7bf3b1f
e3c1e1d
184117d
e3c1e1d
 
184117d
7bf3b1f
e3c1e1d
 
 
184117d
a52faf6
 
9919e6f
668c42c
184117d
 
a52faf6
 
184117d
0498a33
 
 
 
 
 
 
 
a52faf6
285e310
2eb0a24
184117d
 
 
 
 
 
2eb0a24
 
 
184117d
 
2eb0a24
184117d
 
 
 
 
 
 
 
 
77619f4
2eb0a24
 
 
a52faf6
0498a33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a532349
3588612
aa68abd
a52faf6
 
 
 
 
071bea9
184117d
b24410c
184117d
 
74077d8
 
 
 
 
 
 
184117d
 
 
 
74077d8
184117d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74077d8
 
0498a33
184117d
47cd49c
a52faf6
77619f4
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import language_tool_python
import openai
import streamlit as st
import subprocess
from search_errors_logic import check_text
import html
import docx
from io import BytesIO

is_java_installed = False
prompt = """
Ты должен писать комментарии об ошибках в тексте.
Тебе дан кусок текст, в котором есть ошибка, контекст, в котором стоит это слово и сообщение об ошибке. Твоя задача - кратко описать суть ошибки и, если необходимо, исправить её. 
Исправляй только ту ошибку, на которую указывает сообщение. Отвечай на русском языке.

### Пример 1:
Кусок текста:
"кросивую"

Сообщение об ошибке: 
"Возможно найдена орфографическая ошибка."

Текст: 
"...т! Сегодня я был в парке и встретил там кросивую собаку. Она повиляла хвостом и побежа..."

Твой ответ: 
Орфографическая ошибка в слове "кросивую" - правильно "красивую".

### Пример 2:
Кусок текста:
"  "

Сообщение об ошибке: 
"Повтор пробела."

Текст: 
"...ретил там кросивую собаку.  Она повиляла  хвостом и побежала к речке. Я решил что ..."

Твой ответ: 
Обнаружен повтор пробела между словами.

Теперь твоя очередь:
Кусок текста:
"{}"

Сообщение об ошибке: 
"{}"

Текст: 
"{}"
"""


def install_java():
    global is_java_installed
    if is_java_installed: return
    try:
        # Устанавливаем OpenJDK 17
        subprocess.run(["apt-get", "update"], check=True)
        subprocess.run(["apt-get", "install", "-y", "openjdk-17-jdk"], check=True)
        #st.success("Java 17 установлена!")
        is_java_installed = True
    except Exception as e:
        st.error(f"Ошибка установки Java: {e}")


@st.cache_resource
def load_assets():
    openai.api_key = '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'
    install_java()
    tool = language_tool_python.LanguageTool('ru-RU',
                                         language_tool_download_version="6.1")
    return tool


def extract_text_from_docx(file):
    doc = docx.Document(BytesIO(file.getvalue()))
    full_text = []
    for para in doc.paragraphs:
        full_text.append(para.text)
    return "\n".join(full_text)


def main():
    st.markdown("""
        <style>
            /* Сохраняем белый текст для темной темы */
            .stApp, .stTextInput, .stTextArea, .stMarkdown {
                color: white;
            }
            
            /* Специальный стиль для текста внутри выделенных ошибок */
            .error-highlight {
                background-color: #ffe066;
                border-bottom: 2px dotted #ff9900;
                position: relative;
                color: black !important;  /* Принудительно черный текст в выделениях */
            }
            
            /* Стиль для контейнера с результатом */
            .result-container {
                background: rgba(255, 255, 255, 0.1);
                padding: 20px;
                border-radius: 8px;
                border: 1px solid #444;
                white-space: pre-wrap;
                font-family: monospace;
            }
        </style>
    """, unsafe_allow_html=True)

    st.title('Проверка орфографии')
    
    # Добавляем переключатель между режимами ввода
    input_mode = st.radio(
        "Выберите способ ввода текста:",
        ("Ввести текст вручную", "Загрузить Word документ"),
        horizontal=True
    )
    
    text = ""
    if input_mode == "Загрузить Word документ":
        uploaded_file = st.file_uploader("Загрузите Word документ", type=['docx'])
        if uploaded_file is not None:
            try:
                text = extract_text_from_docx(uploaded_file)
                st.text_area("Текст из документа:", value=text, height=200, key="docx_text")
            except Exception as e:
                st.error(f"Ошибка при чтении файла: {e}")
    else:
        text = st.text_area("Введите текст для проверки:", height=200, key="manual_text")

    tool = load_assets()

    if st.button('Проверить текст'):
        if not text.strip():
            st.warning("Введите текст для проверки")
        else:
            text, errors = check_text(text, tool, mode="chat_gpt", highlight_mode=True)
            if not errors:
                st.success("Ошибок не найдено.")
            else:
                sorted_errors = sorted(errors, key=lambda x: x['start'])

                errors_for_higlight = [sorted_errors[0].copy()]
                for error in sorted_errors[1:]:
                    if errors_for_higlight[-1]["end"] >= error["start"]:
                        errors_for_higlight[-1]["end"] = max(errors_for_higlight[-1]["end"], error["end"])
                    else:
                        errors_for_higlight.append(error)
                
                highlighted = []
                last_pos = 0
                
                for error in errors_for_higlight:
                    highlighted.append(html.escape(text[last_pos:error['start']]))
                    
                    highlighted.append(
                        f'<span style="background-color: #ffe066; border-bottom: 2px dotted #ff9900; '
                        f'position: relative;" title="{html.escape(error["message"])}">'
                        f'{html.escape(text[error["start"]:error["end"]])}'
                        f'</span>'
                    )
                    
                    last_pos = error['end']
                
                highlighted.append(html.escape(text[last_pos:]))
                
                html_content = f"""
                <div style="
                    background: white;
                    padding: 20px;
                    border-radius: 8px;
                    border: 1px solid #ddd;
                    white-space: pre-wrap;
                    font-family: monospace;
                    color: #000000; 
                ">
                    {''.join(highlighted)}
                </div>
                """
                
                st.markdown("### Результат проверки:")
                st.markdown(html_content, unsafe_allow_html=True)
                
                st.markdown("### Найденные ошибки:")
                errors_in_order_for_print = sorted(errors, key=lambda x: x['end'])
                for i, error in enumerate(errors_in_order_for_print, 1):
                    st.markdown(f"{i}. {error['message']}")


if __name__ == "__main__":
    main()