File size: 5,150 Bytes
77619f4
184117d
 
e3c1e1d
184117d
a52faf6
 
7bf3b1f
 
184117d
e3c1e1d
41c1169
7bf3b1f
e3c1e1d
184117d
e3c1e1d
 
184117d
7bf3b1f
e3c1e1d
 
 
184117d
a52faf6
 
d7fc09f
668c42c
184117d
 
a52faf6
 
184117d
6306328
 
 
 
 
 
 
 
 
184117d
a52faf6
 
 
 
 
 
 
6306328
a52faf6
 
 
 
184117d
a52faf6
285e310
2eb0a24
184117d
 
 
 
 
 
2eb0a24
 
 
184117d
 
2eb0a24
184117d
 
 
 
 
 
 
 
 
77619f4
2eb0a24
 
 
184117d
a52faf6
184117d
aa68abd
a52faf6
 
 
 
 
aa68abd
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
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:
        # Устанавливаем 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 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>
            /* Сохраняем белый текст для темной темы */
            .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('Проверка орфографии')
    text = st.text_area("Введите текст для проверки:", height=200).replace("\n", " ")
    tool = load_assets()

    if st.button('Проверить текст'):
        if not text.strip():
            st.warning("Введите текст для проверки")
        else:
            errors = check_text(text, tool)
            
            if not errors:
                st.success("Ошибок не найдено! 👍")
            else:
                sorted_errors = sorted(errors, key=lambda x: x['start'])
                
                highlighted = []
                last_pos = 0
                
                for error in sorted_errors:
                    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("### Найденные ошибки:")
                for i, error in enumerate(errors, 1):
                    st.markdown(f"{i}. **Позиция {error['start']}-{error['end']}**: {error['message']}")


if __name__ == "__main__":
    main()