File size: 5,267 Bytes
a52faf6
6306328
a52faf6
e3c1e1d
a52faf6
 
 
7bf3b1f
 
e3c1e1d
41c1169
7bf3b1f
e3c1e1d
 
 
7bf3b1f
e3c1e1d
 
 
a52faf6
 
7af81f3
668c42c
7af81f3
a52faf6
 
6306328
 
 
 
 
 
 
 
 
a52faf6
 
 
 
 
 
 
6306328
a52faf6
 
 
 
 
285e310
2eb0a24
 
 
 
62121f7
7af81f3
2eb0a24
7af81f3
 
2eb0a24
 
 
 
a52faf6
7af81f3
 
 
 
 
 
aa68abd
a52faf6
 
7af81f3
a52faf6
 
 
aa68abd
7af81f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a52faf6
 
7af81f3
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
import language_tool_python
import openai
import streamlit as st
import subprocess
from pathlib import Path
import html

is_java_installed = False

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

@st.cache_resource
def load_assets():
    openai.api_key = 'sk-proj-...'  # Ваш API-ключ
    install_java()
    tool = language_tool_python.LanguageTool('ru-RU', language_tool_download_version="6.1")
    return tool

def generate_gpt_comment(message, context):
    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": f"Прокомментируй ошибку: {message} в данном тексте '{context}'. Не больше одного предложения, на русском."}
        ]
    )
    return response.choices[0].message['content']

def check_text(text, tool):
    matches = tool.check(text)
    errors = []
    for match in matches:
        error_info = {
            'start': match.offset,
            'end': match.offset + match.errorLength,
            'message': generate_gpt_comment(match.message, match.context),
        }
        errors.append(error_info)
    return errors

def main():
    st.markdown("""
        <style>
            .error-highlight {
                background-color: #ffe066;
                border-bottom: 2px dotted #ff9900;
                cursor: pointer;
                color: black !important;
            }
            .error-highlight:hover {
                background-color: #ffd700;
            }
        </style>
    """, unsafe_allow_html=True)

    st.title('Проверка орфографии')
    
    # Сохраняем текст в session_state
    text_input = st.text_area("Введите текст для проверки:", 
                             value=st.session_state.get('text_to_check', ''),
                             height=200)
    text = text_input.replace("\n", " ")
    tool = load_assets()

    if st.button('Проверить текст'):
        st.session_state.text_to_check = text_input
        if not text.strip():
            st.warning("Введите текст для проверки")
        else:
            errors = check_text(text, tool)
            st.session_state.errors = errors
            st.session_state.sorted_errors = sorted(errors, key=lambda x: x['start'])
            st.query_params.clear()  # Очищаем параметры URL

    # Используем сохраненные ошибки при наличии
    errors = st.session_state.get('errors', [])
    sorted_errors = st.session_state.get('sorted_errors', [])

    if errors:
        # Генерация HTML с кликабельными ошибками
        highlighted = []
        last_pos = 0
        
        for index, error in enumerate(sorted_errors):
            highlighted.append(html.escape(text[last_pos:error['start']]))
            highlighted.append(
                f'<a href="?selected_error={index}" style="text-decoration: none; color: inherit;">'
                f'<span class="error-highlight" title="{html.escape(error["message"])}">'
                f'{html.escape(text[error["start"]:error["end"]])}'
                f'</span></a>'
            )
            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)

        # Обработка выбранной ошибки
        selected_error = st.query_params.get("selected_error", None)
        
        if selected_error is not None:
            try:
                selected_index = int(selected_error)
                if 0 <= selected_index < len(sorted_errors):
                    error = sorted_errors[selected_index]
                    st.markdown("### Описание ошибки:")
                    st.markdown(f"**Ошибка {selected_index + 1}** (позиция {error['start']}-{error['end']}): {error['message']}")
                    return  # Прекращаем выполнение, чтобы не показывать все ошибки
            except:
                pass

        # Показываем все ошибки, если не выбрана конкретная
        st.markdown("### Найденные ошибки:")
        for i, error in enumerate(sorted_errors, 1):
            st.markdown(f"{i}. **Позиция {error['start']}-{error['end']}**: {error['message']}")

if __name__ == "__main__":
    main()