import streamlit as st from streamlit_float import * from streamlit_antd_components import * from streamlit.components.v1 import html import spacy from spacy import displacy import spacy_streamlit import pandas as pd import base64 import re from .morphosyntax_process import ( process_morphosyntactic_input, format_analysis_results, perform_advanced_morphosyntactic_analysis, get_repeated_words_colors, highlight_repeated_words, POS_COLORS, POS_TRANSLATIONS ) from ..utils.widget_utils import generate_unique_key from ..database.morphosintax_mongo_db import store_student_morphosyntax_result from ..database.chat_mongo_db import store_chat_history, get_chat_history import logging logger = logging.getLogger(__name__) def display_morphosyntax_interface(lang_code, nlp_models, morpho_t): try: # CSS para mejorar la estabilidad y prevenir saltos st.markdown(""" """, unsafe_allow_html=True) # 1. Inicializar el estado if 'morphosyntax_state' not in st.session_state: st.session_state.morphosyntax_state = { 'input_text': "", 'analysis_count': 0, 'last_analysis': None, 'current_tab': 0 } # 2. Contenedor principal con diseño sticky with st.container(): # Campo de entrada de texto input_key = f"morpho_input_{st.session_state.morphosyntax_state['analysis_count']}" sentence_input = st.text_area( morpho_t.get('morpho_input_label', 'Enter text to analyze'), height=150, placeholder=morpho_t.get('morpho_input_placeholder', 'Enter your text here...'), key=input_key, on_change=lambda: None # Previene recargas innecesarias ) # 3. Botón de análisis centrado col1, col2, col3 = st.columns([2,1,2]) with col1: analyze_button = st.button( morpho_t.get('morpho_analyze_button', 'Analyze Morphosyntax'), key=f"morpho_button_{st.session_state.morphosyntax_state['analysis_count']}", type="primary", icon="🔍", disabled=not bool(sentence_input.strip()), use_container_width=True ) # 4. Procesar análisis if analyze_button and sentence_input.strip(): try: with st.spinner(morpho_t.get('processing', 'Processing...')): doc = nlp_models[lang_code](sentence_input) advanced_analysis = perform_advanced_morphosyntactic_analysis( sentence_input, nlp_models[lang_code] ) st.session_state.morphosyntax_result = { 'doc': doc, 'advanced_analysis': advanced_analysis } st.session_state.morphosyntax_state['analysis_count'] += 1 # Guardar resultado if store_student_morphosyntax_result( username=st.session_state.username, text=sentence_input, arc_diagrams=advanced_analysis['arc_diagrams'] ): st.success(morpho_t.get('success_message', 'Analysis saved successfully')) st.session_state.morphosyntax_state['current_tab'] = 0 display_morphosyntax_results( st.session_state.morphosyntax_result, lang_code, morpho_t ) else: st.error(morpho_t.get('error_message', 'Error saving analysis')) except Exception as e: logger.error(f"Error en análisis morfosintáctico: {str(e)}") st.error(morpho_t.get('error_processing', f'Error processing text: {str(e)}')) # 5. Mostrar resultados previos elif 'morphosyntax_result' in st.session_state and st.session_state.morphosyntax_result: display_morphosyntax_results( st.session_state.morphosyntax_result, lang_code, morpho_t ) elif not sentence_input.strip(): st.info(morpho_t.get('morpho_initial_message', 'Enter text to begin analysis')) except Exception as e: logger.error(f"Error general en display_morphosyntax_interface: {str(e)}") st.error("Se produjo un error. Por favor, intente de nuevo.") def display_morphosyntax_results(result, lang_code, morpho_t): if result is None: st.warning(morpho_t.get('no_results', 'No results available')) return doc = result['doc'] advanced_analysis = result['advanced_analysis'] # Leyenda fija en la parte superior with st.container(): st.markdown(f"##### {morpho_t.get('legend', 'Legend: Grammatical categories')}") legend_html = "