fixes_v3
Browse files
app.py
CHANGED
@@ -77,7 +77,7 @@ def main():
|
|
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.
|
81 |
|
82 |
# Используем сохраненные ошибки при наличии
|
83 |
errors = st.session_state.get('errors', [])
|
@@ -91,10 +91,10 @@ def main():
|
|
91 |
for index, error in enumerate(sorted_errors):
|
92 |
highlighted.append(html.escape(text[last_pos:error['start']]))
|
93 |
highlighted.append(
|
94 |
-
f'<
|
95 |
-
f'
|
96 |
f'{html.escape(text[error["start"]:error["end"]])}'
|
97 |
-
f'</span
|
98 |
)
|
99 |
last_pos = error['end']
|
100 |
|
@@ -117,24 +117,38 @@ def main():
|
|
117 |
st.markdown("### Результат проверки:")
|
118 |
st.markdown(html_content, unsafe_allow_html=True)
|
119 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
# Обработка выбранной ошибки
|
121 |
-
selected_error
|
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.
|
136 |
-
|
137 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
|
139 |
if __name__ == "__main__":
|
140 |
main()
|
|
|
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.session_state.selected_error = None # Сброс выбранной ошибки
|
81 |
|
82 |
# Используем сохраненные ошибки при наличии
|
83 |
errors = st.session_state.get('errors', [])
|
|
|
91 |
for index, error in enumerate(sorted_errors):
|
92 |
highlighted.append(html.escape(text[last_pos:error['start']]))
|
93 |
highlighted.append(
|
94 |
+
f'<span class="error-highlight" onclick="window.parent.postMessage({{index: {index}}}, \'*\')" '
|
95 |
+
f'title="{html.escape(error["message"])}">'
|
96 |
f'{html.escape(text[error["start"]:error["end"]])}'
|
97 |
+
f'</span>'
|
98 |
)
|
99 |
last_pos = error['end']
|
100 |
|
|
|
117 |
st.markdown("### Результат проверки:")
|
118 |
st.markdown(html_content, unsafe_allow_html=True)
|
119 |
|
120 |
+
# JavaScript для обработки кликов
|
121 |
+
st.markdown("""
|
122 |
+
<script>
|
123 |
+
window.addEventListener('message', function(event) {
|
124 |
+
if (event.data.index !== undefined) {
|
125 |
+
const index = event.data.index;
|
126 |
+
// Отправляем индекс в Streamlit
|
127 |
+
const streamlitDoc = window.parent.document;
|
128 |
+
const iframe = streamlitDoc.querySelector('iframe[data-testid="stIFrame"]');
|
129 |
+
if (iframe) {
|
130 |
+
iframe.contentWindow.postMessage({type: 'streamlit:setComponentValue', value: index}, '*');
|
131 |
+
}
|
132 |
+
}
|
133 |
+
});
|
134 |
+
</script>
|
135 |
+
""", unsafe_allow_html=True)
|
136 |
+
|
137 |
# Обработка выбранной ошибки
|
138 |
+
if 'selected_error' not in st.session_state:
|
139 |
+
st.session_state.selected_error = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
|
141 |
+
# Обновляем selected_error через кнопку (для демонстрации)
|
142 |
+
# В реальном приложении можно использовать st.experimental_set_query_params
|
143 |
+
selected_error = st.session_state.get('selected_error', None)
|
144 |
+
|
145 |
+
if selected_error is not None:
|
146 |
+
error = sorted_errors[selected_error]
|
147 |
+
st.markdown("### Описание ошибки:")
|
148 |
+
st.markdown(f"**Ошибка {selected_error + 1}** (позиция {error['start']}-{error['end']}): {error['message']}")
|
149 |
+
else:
|
150 |
+
st.markdown("### Найденные ошибки:")
|
151 |
+
st.markdown("🔍 **Кликните на выделенный текст, чтобы увидеть описание ошибки**")
|
152 |
|
153 |
if __name__ == "__main__":
|
154 |
main()
|