AIdeaText commited on
Commit
054d2c2
verified
1 Parent(s): 4361af6

Update modules/morphosyntax/morphosyntax_interface.py

Browse files
modules/morphosyntax/morphosyntax_interface.py CHANGED
@@ -45,214 +45,162 @@ import re
45
 
46
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
47
  try:
48
- # CSS mejorado para estabilidad y layout vertical
49
  st.markdown("""
50
  <style>
51
- .stTextArea textarea {
52
- font-size: 1rem;
53
- line-height: 1.5;
54
- padding: 0.5rem;
55
- border-radius: 0.375rem;
56
- border: 1px solid #e2e8f0;
57
- background-color: white;
58
- min-height: 100px !important;
59
- height: 100px !important;
60
  }
61
- .block-container {
62
- padding-top: 0.5rem !important;
63
- padding-bottom: 0.5rem !important;
64
- margin: 0 !important;
65
  }
66
- .main-content {
67
- display: flex;
68
- flex-direction: column;
69
- gap: 1rem;
70
- padding: 0.5rem;
71
- }
72
- .arc-diagram-container {
73
- width: 100%;
74
- overflow-x: auto;
75
- background-color: white;
76
- padding: 0.5rem;
77
- border-radius: 0.375rem;
78
- box-shadow: 0 1px 2px rgba(0,0,0,0.1);
79
- margin-top: 0.5rem;
80
  }
81
  </style>
82
  """, unsafe_allow_html=True)
83
 
84
- # Inicializaci贸n m谩s robusta del estado
85
- if 'morphosyntax_state' not in st.session_state:
86
- st.session_state.morphosyntax_state = {
87
- 'original_text': '',
88
- 'current_text': '',
89
- 'original_analysis': None,
90
- 'analysis_count': 0,
91
- 'iterations': [] # Inicializaci贸n expl铆cita de iterations como lista vac铆a
92
- }
93
- else:
94
- # Asegurar que todas las claves existan
95
- required_keys = {
96
- 'original_text': '',
97
- 'current_text': '',
98
- 'original_analysis': None,
99
- 'analysis_count': 0,
100
- 'iterations': []
101
- }
102
- for key, default_value in required_keys.items():
103
- if key not in st.session_state.morphosyntax_state:
104
- st.session_state.morphosyntax_state[key] = default_value
105
 
 
 
 
 
 
 
 
106
  with st.container():
107
- # Secci贸n de texto original
108
  st.markdown("### Texto Original")
109
 
110
- # Input para texto original
 
 
111
  original_text = st.text_area(
112
- "Ingrese una oraci贸n",
113
- value=st.session_state.morphosyntax_state['original_text'],
114
- key="original_text_input",
 
115
  placeholder="Ingresar solo una oraci贸n hasta el punto y aparte. Si es punto seguido, dejar as铆.",
116
- height=100,
117
- disabled=False
118
  )
119
 
120
- # Bot贸n para analizar texto original
121
  col1, col2, col3 = st.columns([2,1,2])
122
  with col1:
123
- analyze_original = st.button(
124
  "Analizar Texto Original",
125
- type="primary",
126
  use_container_width=True,
127
  disabled=not bool(original_text.strip())
128
- )
 
 
 
 
 
 
 
129
 
130
- # Procesar texto original
131
- if analyze_original and original_text.strip():
132
- try:
133
- with st.spinner("Procesando texto original..."):
134
- doc = nlp_models[lang_code](original_text)
135
- analysis = perform_advanced_morphosyntactic_analysis(
136
- original_text,
137
- nlp_models[lang_code]
138
- )
139
-
140
- # Actualizar estado de forma segura
141
- st.session_state.morphosyntax_state.update({
142
- 'original_text': original_text,
143
- 'current_text': original_text,
144
- 'original_analysis': {
145
  'doc': doc,
146
- 'advanced_analysis': analysis
147
- },
148
- 'iterations': [] # Reiniciar iteraciones al cambiar texto original
149
- })
150
-
151
- # Guardar en base de datos
152
- if store_student_morphosyntax_result(
153
- username=st.session_state.username,
154
- text=original_text,
155
- arc_diagrams=analysis['arc_diagrams']
156
- ):
157
- st.success("Texto original analizado exitosamente")
158
- else:
159
- st.error("Error al guardar el an谩lisis original")
160
- except Exception as e:
161
- logger.error(f"Error procesando texto original: {str(e)}")
162
- st.error("Error al procesar el texto original")
163
-
164
- # Mostrar diagrama original
165
- if st.session_state.morphosyntax_state['original_analysis']:
166
- display_morphosyntax_results(
167
- st.session_state.morphosyntax_state['original_analysis'],
168
- lang_code,
169
- morpho_t
170
- )
171
-
172
- # Secci贸n de iteraci贸n
173
  st.markdown("---")
174
  st.markdown("### Iteraci贸n Actual")
175
 
176
- # Campo para nueva versi贸n
177
  iteration_text = st.text_area(
178
  "Modifique la oraci贸n",
179
- value=st.session_state.morphosyntax_state['current_text'],
180
- key=f"iteration_input_{st.session_state.morphosyntax_state['analysis_count']}",
181
- placeholder="Ingresar solo una oraci贸n hasta el punto y aparte. Si es punto seguido, dejar as铆.",
182
- height=100
183
  )
184
 
185
- # Bot贸n para analizar iteraci贸n
186
  col1, col2, col3 = st.columns([2,1,2])
187
  with col1:
188
- analyze_iteration = st.button(
189
  "Analizar Cambios",
190
- type="primary",
191
- icon="馃攳",
192
- key=f"analyze_{st.session_state.morphosyntax_state['analysis_count']}",
193
- disabled=not bool(iteration_text.strip()),
194
- use_container_width=True
195
- )
196
-
197
- # Procesar iteraci贸n
198
- if analyze_iteration and iteration_text.strip():
199
- try:
200
  with st.spinner("Procesando cambios..."):
201
- doc = nlp_models[lang_code](iteration_text)
202
- analysis = perform_advanced_morphosyntactic_analysis(
203
- iteration_text,
204
- nlp_models[lang_code]
205
- )
206
-
207
- current_analysis = {
208
- 'doc': doc,
209
- 'advanced_analysis': analysis
210
- }
211
-
212
- # Crear nueva iteraci贸n
213
- new_iteration = {
214
- 'text': iteration_text,
215
- 'analysis': current_analysis,
216
- 'timestamp': pd.Timestamp.now()
217
- }
218
-
219
- # Actualizar estado de forma segura
220
- iterations = st.session_state.morphosyntax_state.get('iterations', [])
221
- iterations.append(new_iteration)
222
- st.session_state.morphosyntax_state.update({
223
- 'current_text': iteration_text,
224
- 'analysis_count': st.session_state.morphosyntax_state['analysis_count'] + 1,
225
- 'iterations': iterations
226
- })
227
-
228
- if store_student_morphosyntax_result(
229
- username=st.session_state.username,
230
- text=iteration_text,
231
- arc_diagrams=analysis['arc_diagrams']
232
- ):
233
- # Mostrar resultados de la iteraci贸n
234
- display_morphosyntax_results(
235
- current_analysis,
236
- lang_code,
237
- morpho_t
238
  )
239
- else:
240
- st.error("Error al guardar la iteraci贸n")
241
- except Exception as e:
242
- logger.error(f"Error procesando iteraci贸n: {str(e)}")
243
- st.error("Error al procesar los cambios")
244
 
245
- # Mostrar historial de iteraciones
246
- if st.session_state.morphosyntax_state.get('iterations', []):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  with st.expander("Historial de Iteraciones", expanded=False):
248
- for idx, iteration in enumerate(reversed(st.session_state.morphosyntax_state['iterations'])):
249
- st.markdown(f"**Iteraci贸n {idx + 1} ({iteration['timestamp'].strftime('%H:%M:%S')})**")
250
  st.text_area(
251
- f"Texto {idx + 1}",
252
  value=iteration['text'],
253
  disabled=True,
254
- height=100,
255
- key=f"hist_text_{idx}"
256
  )
257
  display_morphosyntax_results(
258
  iteration['analysis'],
@@ -262,13 +210,11 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
262
  st.markdown("---")
263
 
264
  except Exception as e:
265
- logger.error(f"Error general en display_morphosyntax_interface: {str(e)}")
266
  st.error("Se produjo un error. Por favor, intente de nuevo.")
267
 
268
 
269
 
270
-
271
-
272
  #########################################################################3
273
  def display_morphosyntax_results(result, lang_code, morpho_t):
274
  """
 
45
 
46
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
47
  try:
48
+ # CSS para prevenir saltos y mejorar estabilidad
49
  st.markdown("""
50
  <style>
51
+ .element-container:has(.stTextArea) {
52
+ position: sticky !important;
53
+ z-index: 1;
 
 
 
 
 
 
54
  }
55
+ .diagram-container {
56
+ position: relative;
57
+ z-index: 0;
 
58
  }
59
+ [data-testid="stVerticalBlock"] {
60
+ gap: 0rem !important;
 
 
 
 
 
 
 
 
 
 
 
 
61
  }
62
  </style>
63
  """, unsafe_allow_html=True)
64
 
65
+ # Controlar estado de la p谩gina
66
+ if 'active_tab' not in st.session_state:
67
+ st.session_state.active_tab = 'morphosyntax'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
+ # Manejar cambios de texto sin recargar
70
+ def handle_text_change():
71
+ text = st.session_state.get(st.session_state.text_key, '')
72
+ st.session_state.current_text = text
73
+ # No provocar rerun aqu铆
74
+
75
+ # Secci贸n de texto original
76
  with st.container():
 
77
  st.markdown("### Texto Original")
78
 
79
+ # Clave 煤nica para el texto
80
+ st.session_state.text_key = f"text_input_{st.session_state.get('analysis_count', 0)}"
81
+
82
  original_text = st.text_area(
83
+ "Ingrese una oraci贸n",
84
+ value=st.session_state.get('current_text', ''),
85
+ key=st.session_state.text_key,
86
+ on_change=handle_text_change,
87
  placeholder="Ingresar solo una oraci贸n hasta el punto y aparte. Si es punto seguido, dejar as铆.",
88
+ height=100
 
89
  )
90
 
 
91
  col1, col2, col3 = st.columns([2,1,2])
92
  with col1:
93
+ if st.button(
94
  "Analizar Texto Original",
 
95
  use_container_width=True,
96
  disabled=not bool(original_text.strip())
97
+ ):
98
+ with st.spinner("Analizando..."):
99
+ try:
100
+ doc = nlp_models[lang_code](original_text)
101
+ analysis = perform_advanced_morphosyntactic_analysis(
102
+ original_text,
103
+ nlp_models[lang_code]
104
+ )
105
 
106
+ # Actualizar solo el diagrama
107
+ with st.container():
108
+ st.markdown("### Diagrama Original")
109
+ display_morphosyntax_results(
110
+ {'doc': doc, 'analysis': analysis},
111
+ lang_code,
112
+ morpho_t
113
+ )
114
+
115
+ # Guardar estado sin recargar
116
+ st.session_state.original_analysis = {
 
 
 
 
117
  'doc': doc,
118
+ 'analysis': analysis
119
+ }
120
+ st.session_state.current_text = original_text
121
+
122
+ if store_student_morphosyntax_result(
123
+ username=st.session_state.username,
124
+ text=original_text,
125
+ arc_diagrams=analysis['arc_diagrams']
126
+ ):
127
+ st.success("An谩lisis guardado")
128
+
129
+ except Exception as e:
130
+ logger.error(f"Error en an谩lisis: {str(e)}")
131
+ st.error("Error al procesar el texto")
132
+
133
+ # Secci贸n de iteraciones
134
+ if 'original_analysis' in st.session_state:
 
 
 
 
 
 
 
 
 
 
135
  st.markdown("---")
136
  st.markdown("### Iteraci贸n Actual")
137
 
138
+ iteration_key = f"iteration_{st.session_state.get('iteration_count', 0)}"
139
  iteration_text = st.text_area(
140
  "Modifique la oraci贸n",
141
+ value=st.session_state.get('current_text', ''),
142
+ key=iteration_key,
143
+ height=100,
144
+ placeholder="Modifique el texto para mejorar la estructura"
145
  )
146
 
 
147
  col1, col2, col3 = st.columns([2,1,2])
148
  with col1:
149
+ if st.button(
150
  "Analizar Cambios",
151
+ use_container_width=True,
152
+ disabled=not bool(iteration_text.strip())
153
+ ):
 
 
 
 
 
 
 
154
  with st.spinner("Procesando cambios..."):
155
+ try:
156
+ doc = nlp_models[lang_code](iteration_text)
157
+ analysis = perform_advanced_morphosyntactic_analysis(
158
+ iteration_text,
159
+ nlp_models[lang_code]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  )
 
 
 
 
 
161
 
162
+ # Actualizar solo el diagrama de iteraci贸n
163
+ with st.container():
164
+ st.markdown("### Diagrama de Iteraci贸n")
165
+ display_morphosyntax_results(
166
+ {'doc': doc, 'analysis': analysis},
167
+ lang_code,
168
+ morpho_t
169
+ )
170
+
171
+ # Guardar iteraci贸n
172
+ if 'iterations' not in st.session_state:
173
+ st.session_state.iterations = []
174
+
175
+ st.session_state.iterations.append({
176
+ 'text': iteration_text,
177
+ 'analysis': {'doc': doc, 'analysis': analysis},
178
+ 'timestamp': pd.Timestamp.now()
179
+ })
180
+
181
+ st.session_state.current_text = iteration_text
182
+ st.session_state.iteration_count = len(st.session_state.iterations)
183
+
184
+ if store_student_morphosyntax_result(
185
+ username=st.session_state.username,
186
+ text=iteration_text,
187
+ arc_diagrams=analysis['arc_diagrams']
188
+ ):
189
+ st.success("Iteraci贸n guardada")
190
+
191
+ except Exception as e:
192
+ logger.error(f"Error en iteraci贸n: {str(e)}")
193
+ st.error("Error al procesar los cambios")
194
+
195
+ # Historial de iteraciones
196
+ if st.session_state.get('iterations'):
197
  with st.expander("Historial de Iteraciones", expanded=False):
198
+ for idx, iteration in enumerate(reversed(st.session_state.iterations)):
 
199
  st.text_area(
200
+ f"Texto de iteraci贸n {idx + 1}",
201
  value=iteration['text'],
202
  disabled=True,
203
+ height=100
 
204
  )
205
  display_morphosyntax_results(
206
  iteration['analysis'],
 
210
  st.markdown("---")
211
 
212
  except Exception as e:
213
+ logger.error(f"Error general: {str(e)}")
214
  st.error("Se produjo un error. Por favor, intente de nuevo.")
215
 
216
 
217
 
 
 
218
  #########################################################################3
219
  def display_morphosyntax_results(result, lang_code, morpho_t):
220
  """