From c2c1c137297c94e89a23ca9cbf5066b3bf992e69 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 2 May 2025 20:22:08 +0200 Subject: [PATCH] Antes de cambiar la forma de comunicar los datos a los scripts. --- .../__pycache__/pagina_html.cpython-310.pyc | Bin 2520 -> 2520 bytes .../ImportHTML/models/pagina_html.py | 8 +- .../script_groups/ImportHTML/requirements.txt | 6 +- .../docx_converter.cpython-310.pyc | Bin 0 -> 3090 bytes .../__pycache__/html_parser.cpython-310.pyc | Bin 10131 -> 8097 bytes .../ImportHTML/utils/docx_converter.py | 150 ++++ .../ImportHTML/utils/html_parser.py | 757 +++++++----------- backend/script_groups/ImportHTML/x1.py | 98 ++- backend/script_groups/ragex/data.json | 3 - backend/script_groups/ragex/description.json | 6 - .../script_groups/ragex/esquema_group.json | 3 - backend/script_groups/ragex/esquema_work.json | 21 - backend/script_groups/ragex/openai_api_key.py | 3 - backend/script_groups/ragex/work_dir.json | 6 - backend/script_groups/ragex/x1.py | 112 --- backend/script_groups/ragex/x2.py | 126 --- data/log.txt | 335 +------- 17 files changed, 555 insertions(+), 1079 deletions(-) create mode 100644 backend/script_groups/ImportHTML/utils/__pycache__/docx_converter.cpython-310.pyc create mode 100644 backend/script_groups/ImportHTML/utils/docx_converter.py delete mode 100644 backend/script_groups/ragex/data.json delete mode 100644 backend/script_groups/ragex/description.json delete mode 100644 backend/script_groups/ragex/esquema_group.json delete mode 100644 backend/script_groups/ragex/esquema_work.json delete mode 100644 backend/script_groups/ragex/openai_api_key.py delete mode 100644 backend/script_groups/ragex/work_dir.json delete mode 100644 backend/script_groups/ragex/x1.py delete mode 100644 backend/script_groups/ragex/x2.py diff --git a/backend/script_groups/ImportHTML/models/__pycache__/pagina_html.cpython-310.pyc b/backend/script_groups/ImportHTML/models/__pycache__/pagina_html.cpython-310.pyc index 03f75d6ed2d6bd1743de1c83246e4fe162e38cad..9d54b8c39b11c5dd5ef4fb44ecb8f9347c4c304c 100644 GIT binary patch delta 34 pcmca1d_$NwpO=@50SNB@`;eZ!k#_?Jd1C;M>r007A|3+n&? delta 34 ocmca1d_$NwpO=@50SLDEe@O4%$h(1qF>3NYj$THM$v&Jt0JNJ5umAu6 diff --git a/backend/script_groups/ImportHTML/models/pagina_html.py b/backend/script_groups/ImportHTML/models/pagina_html.py index 31bfdbe..350db30 100644 --- a/backend/script_groups/ImportHTML/models/pagina_html.py +++ b/backend/script_groups/ImportHTML/models/pagina_html.py @@ -49,13 +49,13 @@ class PaginaHTML: # Contenido md = f"{hash_line}{titulo_line}{origen_line}" - + # Limpiar cualquier artefacto de asteriscos extra antes de agregar el contenido contenido_limpio = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", self.contenido) md += contenido_limpio + "\n\n" - + # Ya no se agregan imágenes al final - se asume que están en el contenido - + md += "---\n\n" return md @@ -67,7 +67,7 @@ class PaginaHTML: slug = re.sub(r"\s+", "-", slug) return f"- [{self.titulo}](#{slug})" - + def add_imagen(self, imagen): """Añade una referencia a una imagen asociada a esta página.""" if imagen not in self.imagenes: diff --git a/backend/script_groups/ImportHTML/requirements.txt b/backend/script_groups/ImportHTML/requirements.txt index 9d1ade5..8947d8b 100644 --- a/backend/script_groups/ImportHTML/requirements.txt +++ b/backend/script_groups/ImportHTML/requirements.txt @@ -1,3 +1,5 @@ -beautifulsoup4==4.10.0 +beautifulsoup4==4.12.2 html2text==2020.1.16 -requests==2.28.1 +requests==2.31.0 +pypandoc==1.11 +mammoth==1.6.0 diff --git a/backend/script_groups/ImportHTML/utils/__pycache__/docx_converter.cpython-310.pyc b/backend/script_groups/ImportHTML/utils/__pycache__/docx_converter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..016aa94868af2fd438280146ac867455ca277a3f GIT binary patch literal 3090 zcmZWrUvJ#F5hp3FR=Zxyj_o)}aew5dhgeSHG`VXZj9k(~azGAfazS%Iu4_39ddaM{ z(Mk%*wPQtlXyE`!AA){>Yk>7jfqS^8euVoL1p3scJoYtck`AR^*M~~rNW&Qphn(MV zn9j~N5j>l7|L(b`5&D;5jz0vL-$9c%fiT2yjM~)~w{gjnHi0jRt%2RPv5{GEZQ!&W z__tZ@8EV&=!|L#L8NP=C_cd5TcLJ>KyHxGKw|STLqJ-Z1=JxNqX1?h&3qQs?3z`fu zLJIZq3-E!Fmjt68`U`%Jp5upvSm z>O|qZzz1aHsD%O*uHo4HOZz?|h&63wqXP@0`{*9JjO1t!#+dhy(C&l$9>~?={*M@q zS{UUYg7p&x`W~?bwN$hYFwA3{d5mqgc+^MO(o1q5Iba7?+4`<^Z}Q#4dnhzV-M0IQ6?}vKw)sxX&WNyNV8Y0u1$UQ}KwUd&z~; z27jUi-RB8Q{g_HW8vJzF;|Z5OjVA+B5v4wZk*q&VR4UiYao+$ST>d1Is*^tILeP&M z$G8V=5t_UMlKigPEfXNF4x(0T}qgj~e zDax*EBY@x-pwb6Gm0_HlhByuXJ%)qmrQM;4c?F7f-7<3EJ8D1UZ}6qp@8M}%S<-9U z{fzh8RzK@$m&Tw0sK}kt@Wt0Awi>VJt<9^~Hhy_242$b)TN-zCePU3Pz3n^NlA@dc z<_orKFqd>Ay5ZkReaZc72-qrN#)Uy8NF(S0L`^(D_XeNKPghJQNjof(S(-%KF<%Gg z@|7=zNQIwOU^hTLT5$>Y4Zm%H)A`a@)kY*>`^ZADpzAwSQl*5bnT6D37Dr0B=HH5W zqKV+(`*0i3oG`f;sU1yHsqG97J#F{XC=o5AY^ND$*Y-rDxOQj;9MiQ-M2XUkFQ0UI zrlK?fQ%VGmu9ZIO2CSPW(g@s#5ljbJ*lw1xPB{U7s4@S6=oTbtXPRMpv05RQoyn>h zl|P_2lx>6%`hCdeREGDuBFdBu?@~brw`l?>5YxVG+I$;5ZjG1IJHjngiT<+b&n&j4zhQtik5qS>3z&)wpb zMM=-Ud~VDC{F=XWdE=qrawj0|Q&BHT1@G`druJd?1nmi$?Z|ec9N!tx41&20nzNH7 zRg2K|v7NH%hE(GP6h5<^8h zlT%hZDpJEZ)r})KYj+y5eEI+IS{}+d+3@qlN(N`^baOWRfQU=rhqw$RI4PFlqul|0 z!~qggoH1;DKnH_V?X(xCD^n?~w>rn$RieuFOf=|qc+5@G>)I}jhaBLp043stvC@=^ z3ROZ}n81o9Lrf*twp4rovvMf`MpArWIzP@*INhg?9?jQDw`Ig4ng~%N`#-Dy^wv(7TnjI}15m#cUx4wSU4G0S)S=ygCZ7Q*FkB^;px&S{ zW>C+@P?rwzDY$w;v&xEKzp@Gh6$?GCwBRaK@#UC0bB}QisA#2bDVv#c1sYrCq64)I zu3IpZ2N#!8uYlSU%;&etD*Xpe<0z*-?GGWsP}Et}g~N!(Re_(z!8h6DKTO4dLb>>Q z65p!O=dG1+b9H^~dJt}ft2qgS+*;Y(%*obPerEMS5hlT^$tR<+8YZjPSD+`z-SBdF zB}~Fk^QDQ>=301hD_Grp5X!9}uN%1!;*+K)*$QB2Sd_o#!=f6W!1ycqspI{iWpu&< zOpw{8xBxqzJ7Mzl(+i`VG@F6_KWJ-*%P!5ht_z;Uw95m_BvzF*!klWlN}Z%aRS7MF zDzO1%51RZ15VvMqfQ%A7Ufr`i+rur(vusl81&uOgt7$(2eO)&vdmL?7skJaj8IR?9 sR$iVvJ8BSDiDRHtS~xcQkqg?r3gd<`zh=s>^o$=RMq9XrUD8Vb3m3dvUjP6A literal 0 HcmV?d00001 diff --git a/backend/script_groups/ImportHTML/utils/__pycache__/html_parser.cpython-310.pyc b/backend/script_groups/ImportHTML/utils/__pycache__/html_parser.cpython-310.pyc index 2fd27fccd9acf602dfd12a0384a464e2db3e0281..91472f862867171681640209d5249103780c7bcc 100644 GIT binary patch literal 8097 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:"/\\|?*]', "_", filename) + if not filename.endswith(f".{extension}"): + filename = f"{filename}.{extension}" + + # Ruta completa para guardar la imagen + image_path = os.path.join(dir_adjuntos, filename) + + # Verificar si el objeto imagen tiene el atributo 'content' + if hasattr(image, 'content') and image.content: + # Guardar la imagen + with open(image_path, 'wb') as f: + f.write(image.content) + + # Agregar a la lista de imágenes procesadas + if filename not in imagenes_procesadas: + imagenes_procesadas.append(filename) + + # Retornar el formato para Obsidian + return {"src": filename} + else: + # Si no hay contenido, registrar el problema + print(f"Advertencia: No se pudo extraer contenido de imagen '{filename}'") + # Retornar un marcador de posición + return {"src": "imagen_no_disponible.png"} + + except Exception as e: + print(f"Error procesando imagen en DOCX: {str(e)}") + # En caso de error, retornar un marcador de texto + return {"alt": "Imagen no disponible"} + + try: + # Configurar opciones de conversión personalizada para manejar casos problemáticos + options = { + "ignore_empty_paragraphs": True, + "style_map": "p[style-name='Heading 1'] => h1:fresh" + } + + # Abrir el archivo DOCX + with open(ruta_archivo, "rb") as docx_file: + # Convertir con manejo de errores mejorado + result = mammoth.convert_to_markdown( + docx_file, + convert_image=mammoth.images.img_element(manejar_imagen), + options=options + ) + + # Extraer el título (primera línea como encabezado) + markdown_content = result.value + lines = markdown_content.strip().split('\n') + titulo = None + + # Buscar el primer encabezado para usar como título + for line in lines: + if line.startswith('#'): + # Eliminar los símbolos # y espacios + titulo = re.sub(r'^#+\s*', '', line).strip() + break + + # Si no hay encabezado, usar el nombre del archivo + if not titulo: + titulo = Path(ruta_archivo).stem + + # Mostrar advertencias de la conversión + warnings = result.messages + if warnings: + print(f"Advertencias en la conversión:") + for warning in warnings: + print(f"- {warning}") + + # Post-procesar para formato Obsidian + markdown_content = post_procesar_markdown_obsidian(markdown_content, imagenes_procesadas) + + # Crear objeto PaginaHTML + return PaginaHTML( + ruta_archivo=ruta_archivo, + titulo=titulo, + contenido=markdown_content, + imagenes=imagenes_procesadas + ) + + except Exception as e: + print(f"Error procesando DOCX {ruta_archivo}: {str(e)}") + return PaginaHTML( + ruta_archivo=ruta_archivo, + contenido=f"Error al procesar: {str(e)}" + ) + +def post_procesar_markdown_obsidian(markdown, imagenes): + """ + Realiza ajustes adicionales al markdown para formato Obsidian. + """ + # 1. Convertir referencias de imágenes al formato Obsidian + for imagen in imagenes: + # Buscar referencias de imágenes en formato estándar + # y convertirlas al formato Obsidian + markdown = re.sub( + r'!\[(.*?)\]\(' + re.escape(imagen) + r'\)', + f'![[{imagen}]]', + markdown + ) + + # 2. Agregar salto de línea adicional después de cada encabezado + markdown = re.sub(r'(^|\n)(#+\s.*?)(\n(?!\n))', r'\1\2\n\3', markdown) + + # 3. Arreglar listas mal formadas (asegurar espacio después de * o -) + markdown = re.sub(r'(^|\n)([*\-])([^\s])', r'\1\2 \3', markdown) + + # 4. Mejorar formato de tablas + # Asegurar que hay línea en blanco antes y después de tablas + markdown = re.sub(r'([^\n])\n(\|[^\n]+\|)', r'\1\n\n\2', markdown) + markdown = re.sub(r'(\|[^\n]+\|)\n([^\n\|])', r'\1\n\n\2', markdown) + + # 5. Normalizar fin de líneas + markdown = markdown.replace('\r\n', '\n') + + # 6. Eliminar líneas en blanco consecutivas excesivas + markdown = re.sub(r'\n{3,}', '\n\n', markdown) + + return markdown \ No newline at end of file diff --git a/backend/script_groups/ImportHTML/utils/html_parser.py b/backend/script_groups/ImportHTML/utils/html_parser.py index d6597c0..31aba32 100644 --- a/backend/script_groups/ImportHTML/utils/html_parser.py +++ b/backend/script_groups/ImportHTML/utils/html_parser.py @@ -7,14 +7,24 @@ from bs4 import BeautifulSoup from urllib.parse import urlparse, unquote import requests import shutil -import html2text # Añadir esta librería from models.pagina_html import PaginaHTML +# Importar pypandoc para la conversión mejorada +try: + import pypandoc + PANDOC_AVAILABLE = True +except ImportError: + print("⚠️ Advertencia: pypandoc no está instalado. Se utilizará html2text como fallback.") + import html2text + PANDOC_AVAILABLE = False def procesar_html(ruta_archivo, dir_adjuntos): """ Procesa un archivo HTML y lo convierte a Markdown, descargando las imágenes a la carpeta de adjuntos. + + Esta función mantiene la misma firma que la versión original + para garantizar compatibilidad con el flujo existente. """ # Lista de encodings para intentar encodings = ["utf-8", "latin-1", "iso-8859-1", "windows-1252", "cp1252"] @@ -40,11 +50,19 @@ def procesar_html(ruta_archivo, dir_adjuntos): # Obtener la lista de imágenes procesadas imagenes_procesadas = procesar_imagenes(soup, dir_adjuntos, ruta_archivo) - # Procesar tablas - procesar_tablas(soup) + # Preprocesar elementos específicos de Word + preprocesar_elementos_word(soup) # Convertir HTML a Markdown - markdown = html_a_markdown(soup) + if PANDOC_AVAILABLE: + # Usar Pandoc para una mejor conversión (especialmente tablas) + markdown = html_a_markdown_pandoc(str(soup), dir_adjuntos) + else: + # Fallback a html2text si Pandoc no está disponible + markdown = html_a_markdown_html2text(soup) + + # Post-procesar el Markdown para formato Obsidian + markdown = post_procesar_markdown(markdown, imagenes_procesadas) # Crear la página HTML con la lista de imágenes return PaginaHTML( @@ -76,475 +94,298 @@ def procesar_html(ruta_archivo, dir_adjuntos): ) -def procesar_imagenes(soup, dir_adjuntos, ruta_archivo_html): +def preprocesar_elementos_word(soup): """ - Procesa todas las imágenes en el HTML, descargándolas al directorio - de adjuntos y actualizando las rutas. + Preprocesa elementos específicos de Word para mejorar la conversión. """ - # Crear directorio si no existe - os.makedirs(dir_adjuntos, exist_ok=True) - - # Directorio base del archivo HTML para resolver rutas relativas - dir_base = os.path.dirname(os.path.abspath(ruta_archivo_html)) - - # Nombre del directorio de adjuntos (solo el nombre, no la ruta completa) - adjuntos_nombre = os.path.basename(dir_adjuntos) - - print(f"Procesando imágenes desde {ruta_archivo_html}") - print(f"Directorio base: {dir_base}") - print(f"Directorio adjuntos: {dir_adjuntos}") - - # Lista para recopilar nombres de archivos de imagen procesados - lista_imagenes = [] + # Eliminar metadatos y scripts + for tag in soup.select('style, script, meta, link'): + tag.decompose() - # Contador de imágenes procesadas - num_imagenes_procesadas = 0 - imagenes_no_encontradas = 0 - imagenes_con_error = 0 - - # Procesar imágenes estándar HTML - for img in soup.find_all("img"): - src = img.get("src") - if not src: - continue - - try: - print(f"Procesando imagen HTML: {src}") - # Determinar si es URL o ruta local - if src.startswith(("http://", "https://")): - # Es una URL remota - nombre_archivo = os.path.basename(urlparse(src).path) - nombre_archivo = unquote(nombre_archivo) - - # Limpiar nombre de archivo - nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) - if not nombre_archivo or nombre_archivo == "_": - nombre_archivo = ( - f"image_{hashlib.md5(src.encode()).hexdigest()[:8]}.jpg" - ) - - # Generar ruta para guardar - ruta_img = os.path.join(dir_adjuntos, nombre_archivo) - - # Descargar imagen - try: - response = requests.get(src, stream=True, timeout=10) - if response.status_code == 200: - with open(ruta_img, "wb") as f: - response.raw.decode_content = True - shutil.copyfileobj(response.raw, f) - - # Actualizar atributo src con solo el nombre del archivo para Obsidian - # y preservar dimensiones originales - img["src"] = nombre_archivo - # Conservar atributos de dimensiones si existen - if not img.get("width") and not img.get("height"): - img["width"] = "auto" # Valor por defecto para mantener proporción - # Añadir a la lista de imágenes procesadas - lista_imagenes.append(nombre_archivo) - except requests.RequestException as e: - print(f"Error descargando imagen {src}: {str(e)}") - else: - # Es una ruta local - resolver relativa al archivo HTML - ruta_img_original = os.path.normpath(os.path.join(dir_base, src)) - - if os.path.exists(ruta_img_original): - # Copiar imagen a adjuntos - nombre_archivo = os.path.basename(ruta_img_original) - # Limpiar nombre de archivo - nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) - ruta_img_destino = os.path.join(dir_adjuntos, nombre_archivo) - - shutil.copy2(ruta_img_original, ruta_img_destino) - - # Actualizar atributo src con solo el nombre del archivo para Obsidian - img["src"] = nombre_archivo - # Conservar atributos de dimensiones si existen - if not img.get("width") and not img.get("height"): - img["width"] = "auto" # Valor por defecto para mantener proporción - # Añadir a la lista de imágenes procesadas - lista_imagenes.append(nombre_archivo) - else: - print(f"Imagen no encontrada: {ruta_img_original}") - imagenes_no_encontradas += 1 - - # Actualizar contador - num_imagenes_procesadas += 1 - except Exception as e: - imagenes_con_error += 1 - print(f"Error procesando imagen HTML {src}: {str(e)}") - - # Procesar imágenes VML (comunes en documentos convertidos desde MS Office) - for img_data in soup.find_all("v:imagedata"): - src = img_data.get("src") - if not src: - continue - - try: - print(f"Procesando imagen VML: {src}") - # Es una ruta local - resolver relativa al archivo HTML - # Decodificar URL encoding (como espacios %20) - src_decoded = unquote(src) - ruta_img_original = os.path.normpath(os.path.join(dir_base, src_decoded)) - - print(f"Buscando imagen en: {ruta_img_original}") - - if os.path.exists(ruta_img_original): - # Copiar imagen a adjuntos - nombre_archivo = os.path.basename(ruta_img_original) - # Limpiar nombre de archivo - nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) - ruta_img_destino = os.path.join(dir_adjuntos, nombre_archivo) - - print(f"Copiando imagen de {ruta_img_original} a {ruta_img_destino}") - shutil.copy2(ruta_img_original, ruta_img_destino) - - # Actualizar atributo src en el tag VML con solo el nombre del archivo - img_data["src"] = nombre_archivo - # Añadir a la lista de imágenes procesadas - lista_imagenes.append(nombre_archivo) - - # También crear un tag img estándar para asegurar que aparezca en Markdown - parent = img_data.find_parent("v:shape") - if parent: - # Obtener dimensiones si están disponibles - width = "" - height = "" - style = parent.get("style", "") - if style: - width_match = re.search(r"width:(\d+\.?\d*)pt", style) - height_match = re.search(r"height:(\d+\.?\d*)pt", style) - if width_match: - width = f' width="{float(width_match.group(1))/12:.0f}"' - if height_match: - height = f' height="{float(height_match.group(1))/12:.0f}"' - - # Crear tag img y colocarlo después del shape (solo con nombre de archivo) - img_tag = soup.new_tag("img", src=nombre_archivo) - if width: - img_tag["width"] = width.strip() - if height: - img_tag["height"] = height.strip() - parent.insert_after(img_tag) - - num_imagenes_procesadas += 1 - else: - imagenes_no_encontradas += 1 - print(f"⚠️ Imagen VML no encontrada: {ruta_img_original}") - - # Buscar en subdirectorios comunes para archivos Office - posibles_dirs = [ - os.path.join(dir_base, os.path.dirname(src_decoded)), - os.path.join( - dir_base, - os.path.splitext(os.path.basename(ruta_archivo_html))[0] - + "_archivos", - ), - os.path.join( - dir_base, - os.path.splitext(os.path.basename(ruta_archivo_html))[0] - + "_files", - ), - os.path.join(dir_base, "image"), - ] - - found = False - for posible_dir in posibles_dirs: - posible_ruta = os.path.join( - posible_dir, os.path.basename(src_decoded) - ) - print(f"Intentando ruta alternativa: {posible_ruta}") - if os.path.exists(posible_ruta): - nombre_archivo = os.path.basename(posible_ruta) - nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) - ruta_img_destino = os.path.join(dir_adjuntos, nombre_archivo) - - print( - f"✅ Imagen encontrada en ruta alternativa. Copiando a {ruta_img_destino}" - ) - shutil.copy2(posible_ruta, ruta_img_destino) - - # Actualizar src con solo el nombre del archivo - img_data["src"] = nombre_archivo - # Añadir a la lista de imágenes procesadas - lista_imagenes.append(nombre_archivo) - - # Crear tag img estándar - parent = img_data.find_parent("v:shape") - if parent: - img_tag = soup.new_tag("img", src=nombre_archivo) - # Asegurarse de que img_tag esté fuera del contexto VML para que - # pueda ser encontrado por los selectores normales - if parent.parent: - parent.parent.append(img_tag) - else: - soup.body.append(img_tag) - - num_imagenes_procesadas += 1 - imagenes_no_encontradas -= ( - 1 # Restamos porque ya no es una imagen no encontrada - ) - found = True - break - - if not found: - print( - f"❌ No se pudo encontrar la imagen VML en ningún directorio alternativo" - ) - except Exception as e: - imagenes_con_error += 1 - print(f"Error procesando imagen VML {src}: {str(e)}") - - # Buscar otras posibles fuentes de imágenes (específicas de Office) - for shape in soup.find_all("v:shape"): - # Algunos documentos Office utilizan v:shape sin v:imagedata - if not shape.find("v:imagedata") and "style" in shape.attrs: - style = shape["style"] - # Buscar referencias a imágenes en estilo - img_refs = re.findall(r'url\(["\']?([^"\']+)["\']?\)', style) - for img_ref in img_refs: - try: - print(f"Procesando imagen de estilo v:shape: {img_ref}") - src_decoded = unquote(img_ref) - # Buscar la imagen en rutas relativas - ruta_img_original = os.path.normpath( - os.path.join(dir_base, src_decoded) - ) - - # Buscar también en directorios comunes de Office - if not os.path.exists(ruta_img_original): - for posible_dir in posibles_dirs: - posible_ruta = os.path.join( - posible_dir, os.path.basename(src_decoded) - ) - if os.path.exists(posible_ruta): - ruta_img_original = posible_ruta - break - - if os.path.exists(ruta_img_original): - # Copiar imagen a adjuntos - nombre_archivo = os.path.basename(ruta_img_original) - nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) - ruta_img_destino = os.path.join(dir_adjuntos, nombre_archivo) - - shutil.copy2(ruta_img_original, ruta_img_destino) - - # Añadir a la lista de imágenes procesadas - lista_imagenes.append(nombre_archivo) - - # Crear un tag de imagen para referencia en Markdown - img_tag = soup.new_tag("img", src=nombre_archivo) - shape.insert_after(img_tag) - num_imagenes_procesadas += 1 - except Exception as e: - print(f"Error procesando imagen de estilo: {str(e)}") - - # Mostrar resumen - print(f"\nResumen de procesamiento de imágenes:") - print(f"- Imágenes procesadas con éxito: {num_imagenes_procesadas}") - print(f"- Imágenes no encontradas: {imagenes_no_encontradas}") - print(f"- Imágenes con error de procesamiento: {imagenes_con_error}") - print( - f"- Total de imágenes encontradas en HTML: {num_imagenes_procesadas + imagenes_no_encontradas + imagenes_con_error}" - ) - print(f"- Nombres de archivos de imágenes procesadas: {lista_imagenes}") - - # Devolver la lista de imágenes procesadas - return lista_imagenes - - -def procesar_tablas(soup): - """ - Procesa las tablas HTML para prepararlas para conversión a Markdown. - """ - for table in soup.find_all("table"): - # Agregar clase para que se convierta correctamente - table["class"] = table.get("class", []) + ["md-table"] - - # Asegurar que todas las filas tienen el mismo número de celdas - rows = table.find_all("tr") - if not rows: - continue - - # Encontrar la fila con más celdas - max_cols = 0 - for row in rows: - cols = len(row.find_all(["td", "th"])) - max_cols = max(max_cols, cols) - - # Asegurar que todas las filas tienen max_cols celdas - for row in rows: - cells = row.find_all(["td", "th"]) - missing = max_cols - len(cells) - if missing > 0: - for _ in range(missing): - if cells and cells[0].name == "th": - new_cell = soup.new_tag("th") - else: - new_cell = soup.new_tag("td") - new_cell.string = "" - row.append(new_cell) - - -def html_a_markdown(soup): - """ - Convierte HTML a texto Markdown utilizando html2text para una mejor conversión. - """ - # Guardar una copia del HTML para debugging - debug_html = str(soup) - - # Reemplazar
con un marcador específico para evitar que se conviertan en asteriscos - for hr in soup.find_all(['hr']): - hr_tag = soup.new_tag('div') - hr_tag.string = "HORIZONTAL_RULE_MARKER" - hr.replace_with(hr_tag) - - # Pre-procesar tablas para asegurar su correcta conversión - for table in soup.find_all("table"): - # Asegurar que la tabla tiene una clase específica para mejor reconocimiento - table["class"] = table.get("class", []) + ["md-table"] + # Intentar limpiar elementos Office específicos + for tag in soup.find_all(['o:p']): + if tag.string: + # Preservar solo el texto + tag.replace_with(soup.new_string(tag.get_text())) + else: + tag.decompose() + + # Convertir elementos VML a elementos HTML estándar + for shape in soup.find_all(['v:shape', 'v:imagedata']): + # Extraer cualquier imagen dentro del shape + img_tags = shape.find_all('img') + if img_tags: + for img in img_tags: + # Mover la imagen fuera del shape + if shape.parent: + shape.parent.insert_before(img) - # Verificar si la tabla tiene encabezados - has_headers = False - rows = table.find_all("tr") - if rows: - first_row_cells = rows[0].find_all(["th"]) - has_headers = len(first_row_cells) > 0 - - # Si no tiene encabezados pero tiene filas, convertir la primera fila en encabezados - if not has_headers and len(rows) > 0: - first_row_cells = rows[0].find_all("td") - for cell in first_row_cells: - new_th = soup.new_tag("th") - new_th.string = cell.get_text().strip() - cell.replace_with(new_th) + # Extraer cualquier texto significativo + text_content = shape.get_text().strip() + if text_content and shape.parent: + text_node = soup.new_tag('p') + text_node.string = text_content + shape.parent.insert_before(text_node) + +def html_a_markdown_pandoc(html_content, dir_adjuntos): + """ + Convierte HTML a Markdown usando Pandoc. + Pandoc maneja mucho mejor tablas, listas y otros elementos complejos. + """ + try: + # Guardar HTML a un archivo temporal + temp_html_path = os.path.join(dir_adjuntos, "temp_conversion.html") + with open(temp_html_path, "w", encoding="utf-8") as f: + f.write(html_content) + + # Convertir usando pypandoc (interfaz para Pandoc) + # Opciones de Pandoc para mejor manejo de tablas + extra_args = [ + '--wrap=none', # No wrap lines + '--extract-media=' + dir_adjuntos, # Extract media to the specified directory + '--standalone' # Process as a standalone document + ] + + # Usar GitHub Flavored Markdown para mejor soporte de tablas + markdown = pypandoc.convert_file( + temp_html_path, + 'gfm', # GitHub Flavored Markdown + extra_args=extra_args + ) + + # Limpiar archivo temporal + if os.path.exists(temp_html_path): + os.remove(temp_html_path) + + return markdown + except Exception as e: + print(f"Error en conversión con Pandoc: {str(e)}") + # Fallback al método antiguo si Pandoc falla + if os.path.exists(temp_html_path): + with open(temp_html_path, "r", encoding="utf-8") as f: + soup = BeautifulSoup(f.read(), "html.parser") + os.remove(temp_html_path) + return html_a_markdown_html2text(soup) + else: + return f"Error en conversión: {str(e)}" + + +def html_a_markdown_html2text(soup): + """ + Método de fallback: convierte HTML a texto Markdown utilizando html2text. + """ # Configurar el conversor html2text h2t = html2text.HTML2Text() h2t.body_width = 0 # No limitar el ancho del cuerpo del texto h2t.ignore_links = False h2t.ignore_images = False h2t.ignore_emphasis = False - h2t.ignore_tables = False # Importante para mantener tablas - h2t.bypass_tables = False # No saltarse las tablas + h2t.ignore_tables = False + h2t.bypass_tables = False h2t.mark_code = True - h2t.unicode_snob = True # Preservar caracteres Unicode - h2t.open_quote = '"' - h2t.close_quote = '"' - h2t.use_automatic_links = True # Mejorar manejo de enlaces + h2t.unicode_snob = True - # Personalizar el manejo de imágenes para formato Obsidian - def custom_image_formatter(src, alt, title): - # Obtener solo el nombre del archivo - filename = os.path.basename(src) - # Retornar el formato Obsidian - return f"![[{filename}]]" + # Procesar tablas para prepararlas para conversión + for table in soup.find_all("table"): + # Agregar clase para mejor reconocimiento + table["class"] = table.get("class", []) + ["md-table"] + + # Verificar si la tabla tiene encabezados + rows = table.find_all("tr") + if rows and not table.find("th"): + # Convertir primera fila a encabezados si no hay th + first_row_cells = rows[0].find_all("td") + for cell in first_row_cells: + new_th = soup.new_tag("th") + new_th.string = cell.get_text().strip() + cell.replace_with(new_th) - h2t.images_with_size = True # Intentar mantener información de tamaño - h2t.image_link_formatter = custom_image_formatter - - # Preprocesamiento: asegurarse de que las imágenes tienen los atributos correctos - for img in soup.find_all("img"): - src = img.get("src", "") - # Asegurarnos de usar el nombre del archivo como src - img["src"] = os.path.basename(src) - - # Eliminar scripts y estilos - for element in soup(["script", "style"]): - element.decompose() - - # Eliminar elementos VML que ya han sido procesados - for element in soup.find_all(["v:shape", "v:imagedata", "o:p"]): - element.decompose() - - # Convertir a Markdown usando html2text + # Convertir a Markdown html_content = str(soup) markdown_content = h2t.handle(html_content) - # Post-procesamiento: convertir cualquier sintaxis de imagen estándar que quede al formato Obsidian - markdown_content = re.sub(r"!\[(.*?)\]\((.*?)\)", lambda m: f"![[{os.path.basename(m.group(2))}]]", markdown_content) - - # Solución alternativa para tablas si html2text falla: buscar tablas directamente en el HTML - if "(.*?)', re.DOTALL) - tables = table_pattern.findall(html_content) - - for i, table_html in enumerate(tables): - soup_table = BeautifulSoup(f"{table_html}
", "html.parser") - markdown_table = [] - - rows = soup_table.find_all("tr") - if rows: - # Procesar encabezados - headers = rows[0].find_all(["th", "td"]) - if headers: - header_row = "|" - for header in headers: - header_row += f" {header.get_text().strip()} |" - markdown_table.append(header_row) - - # Separador - separator = "|" - for _ in headers: - separator += " --- |" - markdown_table.append(separator) - - # Procesar filas de datos - for row in rows[1:] if headers else rows: - cells = row.find_all(["td", "th"]) - if cells: - data_row = "|" - for cell in cells: - data_row += f" {cell.get_text().strip()} |" - markdown_table.append(data_row) - - if markdown_table: - table_md = "\n" + "\n".join(markdown_table) + "\n\n" - # Agregar la tabla al markdown con un marcador único - marker = f"TABLE_MARKER_{i}" - markdown_content += f"\n\n{marker}\n\n" - # Guardar la tabla para reemplazar después - markdown_content = markdown_content.replace(marker, table_md) - - # Limpiar artefactos de conversión - - # 1. Reemplazar múltiples asteriscos o guiones (que representen líneas horizontales) con una línea estándar - markdown_content = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", markdown_content) - - # 2. Reemplazar el marcador de línea horizontal - markdown_content = markdown_content.replace("HORIZONTAL_RULE_MARKER", "---") - - # 3. Eliminar líneas que solo contengan espacios y asteriscos - markdown_content = re.sub(r"^\s*\*+\s*$", "", markdown_content, flags=re.MULTILINE) - - # 4. Eliminar los asteriscos que estén solos en una línea (común en conversiones) - markdown_content = re.sub(r"^(\s*)\*(\s*)$", "", markdown_content, flags=re.MULTILINE) - - # 5. Reemplazar múltiples líneas horizontales consecutivas con una sola - markdown_content = re.sub(r"(---\s*){2,}", "---\n", markdown_content) - - # 6. Limpieza adicional para eliminar asteriscos o guiones consecutivos que no son líneas horizontales - markdown_content = re.sub(r"(?:"/\\|?*]', "_", nombre_archivo) + if not nombre_archivo or nombre_archivo == "_": + nombre_archivo = f"image_{hashlib.md5(src.encode()).hexdigest()[:8]}.jpg" + + # Descargar imagen + ruta_img = os.path.join(dir_adjuntos, nombre_archivo) + try: + response = requests.get(src, stream=True, timeout=10) + if response.status_code == 200: + with open(ruta_img, "wb") as f: + response.raw.decode_content = True + shutil.copyfileobj(response.raw, f) + + # Actualizar src en el tag HTML + if img_tag: + img_tag["src"] = nombre_archivo + + return nombre_archivo + except Exception as e: + print(f"Error descargando imagen {src}: {str(e)}") + stats["con_error"] += 1 + return None + else: + # Es una ruta local - intentar múltiples ubicaciones posibles + src_decoded = unquote(src) + posibles_rutas = [ + os.path.join(dir_base, src_decoded), # Ruta completa + os.path.join(dir_base, os.path.basename(src_decoded)), # Solo el nombre + + # Rutas comunes para archivos Word + os.path.join( + dir_base, + os.path.splitext(os.path.basename(ruta_archivo_html))[0] + "_archivos", + os.path.basename(src_decoded) + ), + os.path.join( + dir_base, + os.path.splitext(os.path.basename(ruta_archivo_html))[0] + "_files", + os.path.basename(src_decoded) + ), + os.path.join(dir_base, "image", os.path.basename(src_decoded)) + ] + + # Probar cada ruta posible + for ruta in posibles_rutas: + if os.path.exists(ruta): + # Copiar imagen a adjuntos + nombre_archivo = os.path.basename(ruta) + nombre_archivo = re.sub(r'[<>:"/\\|?*]', "_", nombre_archivo) + ruta_img_destino = os.path.join(dir_adjuntos, nombre_archivo) + + shutil.copy2(ruta, ruta_img_destino) + + # Actualizar src en el tag HTML + if img_tag: + img_tag["src"] = nombre_archivo + + return nombre_archivo + + print(f"Imagen no encontrada en ninguna ruta: {src}") + stats["no_encontradas"] += 1 + return None + except Exception as e: + print(f"Error procesando imagen {src}: {str(e)}") + stats["con_error"] += 1 + return None + + # 1. Procesar imágenes normales + for img in soup.find_all("img"): + src = img.get("src") + nombre_archivo = procesar_imagen(src, img) + if nombre_archivo and nombre_archivo not in imagenes_procesadas: + imagenes_procesadas.append(nombre_archivo) + stats["procesadas"] += 1 + + # 2. Procesar imágenes VML (Office) + for img_data in soup.find_all("v:imagedata"): + src = img_data.get("src") + nombre_archivo = procesar_imagen(src) + if nombre_archivo and nombre_archivo not in imagenes_procesadas: + imagenes_procesadas.append(nombre_archivo) + stats["procesadas"] += 1 + + # Crear un tag img estándar para asegurar que aparezca en Markdown + new_img = soup.new_tag("img", src=nombre_archivo) + parent = img_data.find_parent() + if parent: + parent.insert_after(new_img) + + # 3. Procesar referencias de imágenes en estilos + style_tags = soup.find_all(["style", lambda tag: tag.has_attr("style")]) + for tag in style_tags: + style_content = tag.get("style", "") if tag.name != "style" else tag.string or "" + img_refs = re.findall(r'url\(["\']?([^"\']+)["\']?\)', style_content) + for img_ref in img_refs: + nombre_archivo = procesar_imagen(img_ref) + if nombre_archivo and nombre_archivo not in imagenes_procesadas: + imagenes_procesadas.append(nombre_archivo) + stats["procesadas"] += 1 + + # Mostrar resumen + print(f"\nResumen de procesamiento de imágenes:") + print(f"- Imágenes procesadas con éxito: {stats['procesadas']}") + print(f"- Imágenes no encontradas: {stats['no_encontradas']}") + print(f"- Imágenes con error de procesamiento: {stats['con_error']}") + + return imagenes_procesadas \ No newline at end of file diff --git a/backend/script_groups/ImportHTML/x1.py b/backend/script_groups/ImportHTML/x1.py index 64a678b..8fd67ea 100644 --- a/backend/script_groups/ImportHTML/x1.py +++ b/backend/script_groups/ImportHTML/x1.py @@ -1,5 +1,5 @@ """ -Script para importar archivos HTML y convertirlos a un archivo Markdown. +Script para importar archivos HTML o DOCX y convertirlos a un archivo Markdown. """ import os @@ -9,8 +9,24 @@ import json from utils.html_parser import procesar_html from utils.markdown_handler import escribir_archivo_markdown +# Verificar si la biblioteca mammoth está disponible para procesamiento DOCX +try: + from utils.docx_converter import procesar_docx + DOCX_SUPPORT = True +except ImportError: + DOCX_SUPPORT = False + print("Nota: Soporte para DOCX no disponible. Instale mammoth para habilitar esta función.") + # Forzar UTF-8 en la salida estándar -sys.stdout.reconfigure(encoding="utf-8") +try: + sys.stdout.reconfigure(encoding="utf-8") +except AttributeError: + # Para versiones anteriores de Python que no tienen reconfigure + pass + +# Definir símbolos de éxito/error sin caracteres especiales +SUCCESS_SYMBOL = "[OK]" +ERROR_SYMBOL = "[ERROR]" def main(): @@ -52,35 +68,81 @@ def main(): print(f"Error: Input directory {input_path} does not exist") return - # Buscar archivos HTML + # Buscar archivos HTML y DOCX html_files = [] + docx_files = [] + + # Buscar archivos HTML for ext in ["*.html", "*.htm"]: html_files.extend(list(input_path.glob(ext))) + + # Buscar archivos DOCX si el soporte está disponible + if DOCX_SUPPORT: + for ext in ["*.docx", "*.doc"]: + docx_files.extend(list(input_path.glob(ext))) print(f"Found {len(html_files)} HTML files") + if DOCX_SUPPORT: + print(f"Found {len(docx_files)} DOCX files") - if not html_files: - print("No HTML files found in the input directory.") + if not html_files and not docx_files: + print("No compatible files found in the input directory.") return - # Procesar archivos HTML + # Procesar archivos paginas = [] - total_files = len(html_files) + total_files = len(html_files) + len(docx_files) successful_files = 0 failed_files = 0 + # Procesar archivos HTML for i, archivo in enumerate(html_files, 1): - print(f"\nProcessing [{i}/{total_files}] {archivo}") - pagina = procesar_html(archivo, attachments_path) - if pagina: - paginas.append(pagina) - # Verificar si hubo error al procesar - if pagina.contenido.startswith("Error al procesar:"): + print(f"\nProcessing HTML [{i}/{total_files}] {archivo}") + try: + pagina = procesar_html(archivo, attachments_path) + if pagina: + paginas.append(pagina) + # Verificar si hubo error al procesar + if pagina.contenido.startswith("Error al procesar:"): + failed_files += 1 + titulo_seguro = str(pagina.contenido).encode('ascii', 'replace').decode('ascii') + print(f"{ERROR_SYMBOL} Failed: {titulo_seguro}") + else: + successful_files += 1 + # Usar codificación ascii para evitar problemas de caracteres + titulo_seguro = str(pagina.titulo).encode('ascii', 'replace').decode('ascii') + print(f"{SUCCESS_SYMBOL} Success: {titulo_seguro}") + except Exception as e: + failed_files += 1 + print(f"{ERROR_SYMBOL} Error processing HTML file: {str(e)}") + + # Procesar archivos DOCX si el soporte está disponible + if DOCX_SUPPORT: + for i, archivo in enumerate(docx_files, len(html_files) + 1): + print(f"\nProcessing DOCX [{i}/{total_files}] {archivo}") + try: + pagina = procesar_docx(archivo, attachments_path) + if pagina: + paginas.append(pagina) + if pagina.contenido.startswith("Error al procesar:"): + failed_files += 1 + titulo_seguro = str(pagina.contenido).encode('ascii', 'replace').decode('ascii') + print(f"{ERROR_SYMBOL} Failed: {titulo_seguro}") + else: + successful_files += 1 + titulo_seguro = str(pagina.titulo).encode('ascii', 'replace').decode('ascii') + print(f"{SUCCESS_SYMBOL} Success: {titulo_seguro}") + except Exception as e: failed_files += 1 - print(f"❌ Failed: {pagina.contenido}") - else: - successful_files += 1 - print(f"✅ Success: {pagina.titulo}") + error_msg = str(e).encode('ascii', 'replace').decode('ascii') + print(f"{ERROR_SYMBOL} Error processing DOCX file: {error_msg}") + # Crear página con error + from models.pagina_html import PaginaHTML + error_pagina = PaginaHTML( + ruta_archivo=archivo, + contenido=f"Error al procesar DOCX: {str(e)}" + ) + paginas.append(error_pagina) # Escribir el archivo Markdown if paginas: @@ -99,4 +161,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/backend/script_groups/ragex/data.json b/backend/script_groups/ragex/data.json deleted file mode 100644 index 0e0dcd2..0000000 --- a/backend/script_groups/ragex/data.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} \ No newline at end of file diff --git a/backend/script_groups/ragex/description.json b/backend/script_groups/ragex/description.json deleted file mode 100644 index 6ab0524..0000000 --- a/backend/script_groups/ragex/description.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "RAGEX", - "description": "This script processes text files into a chronological narrative in Markdown format, optimized for processing with Large Language Models (LLMs). It extracts essential information from text files while removing unnecessary metadata, creating a clean, temporal narrative that can be easily analyzed.", - "version": "1.0", - "author": "Miguel" -} \ No newline at end of file diff --git a/backend/script_groups/ragex/esquema_group.json b/backend/script_groups/ragex/esquema_group.json deleted file mode 100644 index 0e0dcd2..0000000 --- a/backend/script_groups/ragex/esquema_group.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} \ No newline at end of file diff --git a/backend/script_groups/ragex/esquema_work.json b/backend/script_groups/ragex/esquema_work.json deleted file mode 100644 index 9c49659..0000000 --- a/backend/script_groups/ragex/esquema_work.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "object", - "properties": { - "in_dir": { - "type": "string", - "format": "directory", - "title": "Subdirectorio desde donde hacer la ingesta de los datos", - "description": "Subdirectorio desde donde hacer la ingesta de los datos" - }, - "model": { - "type": "string", - "title": "Model", - "description": "OpenAI Model" - }, - "query": { - "type": "string", - "title": "Consulta", - "description": "Consulta" - } - } -} \ No newline at end of file diff --git a/backend/script_groups/ragex/openai_api_key.py b/backend/script_groups/ragex/openai_api_key.py deleted file mode 100644 index 1826e5d..0000000 --- a/backend/script_groups/ragex/openai_api_key.py +++ /dev/null @@ -1,3 +0,0 @@ -# Configura tu clave API de OpenAI -def openai_api_key(): - return 'sk-HIY5DSK03Lr' \ No newline at end of file diff --git a/backend/script_groups/ragex/work_dir.json b/backend/script_groups/ragex/work_dir.json deleted file mode 100644 index 21a63c1..0000000 --- a/backend/script_groups/ragex/work_dir.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "path": "D:\\Proyectos\\Scripts\\RAG\\TEST", - "history": [ - "D:\\Proyectos\\Scripts\\RAG\\TEST" - ] -} \ No newline at end of file diff --git a/backend/script_groups/ragex/x1.py b/backend/script_groups/ragex/x1.py deleted file mode 100644 index 114acca..0000000 --- a/backend/script_groups/ragex/x1.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -Este script realiza la ingesta de los datos alammacenados en el subdirectorio de ingesta. -""" - -import os -import sys -from pathlib import Path -import json -from langchain_text_splitters import RecursiveCharacterTextSplitter -from langchain_community.vectorstores import Chroma -from langchain_openai import OpenAIEmbeddings # Cambiado a OpenAI Embeddings -from langchain_community.embeddings import HuggingFaceEmbeddings -from langchain_core.documents import Document -import os -import glob - - -def load_documents(directory): - documents = [] - - # Cargar archivos markdown - for md_file in glob.glob(os.path.join(directory, "**/*.md"), recursive=True): - with open(md_file, "r", encoding="utf-8") as f: - content = f.read() - documents.append( - { - "content": content, - "metadata": {"source": md_file, "type": "markdown"}, - } - ) - - # Cargar archivos de texto - for txt_file in glob.glob(os.path.join(directory, "**/*.txt"), recursive=True): - with open(txt_file, "r", encoding="utf-8") as f: - content = f.read() - documents.append( - {"content": content, "metadata": {"source": txt_file, "type": "text"}} - ) - - return documents - - -def process_documents(documents, db_directory): - # Usar OpenAI Embeddings en lugar de HuggingFace - embeddings = OpenAIEmbeddings(model="text-embedding-3-small") - - # Dividir documentos en chunks - text_splitter = RecursiveCharacterTextSplitter( - chunk_size=1000, - chunk_overlap=200, - separators=["\n## ", "\n### ", "\n#### ", "\n", " ", ""], - keep_separator=True, - ) - - docs = [] - for doc in documents: - chunks = text_splitter.split_text(doc["content"]) - for i, chunk in enumerate(chunks): - docs.append( - Document( - page_content=chunk, - metadata={ - **doc["metadata"], - "chunk_id": i, - "chunk": chunk[:100] + "...", # Extracto para referencia - }, - ) - ) - - # Configurar Chroma para evitar dependencia de ONNX - from chromadb.config import Settings - - # Crear o actualizar la base de datos vectorial con configuración específica - db = Chroma.from_documents( - docs, - embeddings, - persist_directory=db_directory, - client_settings=Settings(anonymized_telemetry=False, is_persistent=True), - ) - db.persist() - - print(f"Procesados {len(docs)} fragmentos de {len(documents)} documentos") - return db - - -def main(): - # Cargar configuraciones del entorno - configs = json.loads(os.environ.get("SCRIPT_CONFIGS", "{}")) - - # Obtener working directory - working_directory = configs.get("working_directory", ".") - - # Obtener configuraciones de nivel 2 (grupo) - group_config = configs.get("level2", {}) - - work_config = configs.get("level3", {}) - in_dir = work_config.get("in_dir", ".") - - docs_directory = os.path.join(working_directory, in_dir) - db_directory = os.path.join(working_directory, "chroma_db") - - print("Cargando documentos...") - documents = load_documents(docs_directory) - print(f"Se encontraron {len(documents)} documentos.") - - print("Procesando e indexando documentos...") - db = process_documents(documents, db_directory) - print("¡Ingesta completada con éxito!") - - -if __name__ == "__main__": - main() diff --git a/backend/script_groups/ragex/x2.py b/backend/script_groups/ragex/x2.py deleted file mode 100644 index ee7205e..0000000 --- a/backend/script_groups/ragex/x2.py +++ /dev/null @@ -1,126 +0,0 @@ -""" -Este script realiza la consulta usando RAGEX a la base de datos de documentos. -""" - -import os -import sys -from pathlib import Path -import json -from langchain_community.vectorstores import Chroma -from langchain_openai import ( - OpenAIEmbeddings, -) # Cambiado de HuggingFaceEmbeddings a OpenAIEmbeddings -from langchain_openai import ChatOpenAI -from langchain_core.output_parsers import StrOutputParser -from langchain_core.prompts import ChatPromptTemplate -from langchain_core.runnables import RunnablePassthrough -from rich.console import Console -from rich.markdown import Markdown -import os -import argparse -from openai_api_key import openai_api_key - - -console = Console() - - -class CitationTracker: - def __init__(self): - self.citations = [] - - def add_citation(self, text, metadata): - self.citations.append({"text": text, "metadata": metadata}) - - def get_formatted_citations(self): - result = "\n## Fuentes\n\n" - for i, citation in enumerate(self.citations, 1): - source = citation["metadata"]["source"] - result += f"{i}. [{os.path.basename(source)}]({source}) - Fragmento {citation['metadata']['chunk_id']}\n" - return result - - -def search_with_citation(query, db_directory, model="gpt-3.5-turbo"): - # Cargar embeddings y base de datos - embeddings = OpenAIEmbeddings( - model="text-embedding-3-small" - ) # Usar OpenAI Embeddings igual que en x1.py - - db = Chroma(persist_directory=db_directory, embedding_function=embeddings) - - api_key = openai_api_key() - os.environ["OPENAI_API_KEY"] = api_key - - # Configurar el LLM de OpenAI - llm = ChatOpenAI(model_name=model) - - # Rastreador de citas - citation_tracker = CitationTracker() - - # Recuperar documentos relevantes - retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 5}) - - # Plantilla para el prompt - template = """ - Responde a la siguiente pregunta basándote exclusivamente en la información proporcionada. - Incluye referencias a las fuentes originales para cada afirmación importante usando [Fuente N]. - Si la información no es suficiente, indícalo claramente. - - Contexto: - {context} - - Pregunta: {question} - - Respuesta (incluye [Fuente N] para citar): - """ - - prompt = ChatPromptTemplate.from_template(template) - - # Función para formatear el contexto - def format_docs(docs): - formatted_context = "" - for i, doc in enumerate(docs, 1): - citation_tracker.add_citation(doc.page_content, doc.metadata) - formatted_context += f"[Fuente {i}]: {doc.page_content}\n\n" - return formatted_context - - # Cadena RAG - rag_chain = ( - {"context": retriever | format_docs, "question": RunnablePassthrough()} - | prompt - | llm - | StrOutputParser() - ) - - # Ejecutar búsqueda - response = rag_chain.invoke(query) - - # Agregar citas al final - full_response = response + "\n\n" + citation_tracker.get_formatted_citations() - - return full_response - - -def main(): - # Cargar configuraciones del entorno - configs = json.loads(os.environ.get("SCRIPT_CONFIGS", "{}")) - - # Obtener working directory - working_directory = configs.get("working_directory", ".") - - # Obtener configuraciones de nivel 2 (grupo) - group_config = configs.get("level2", {}) - - work_config = configs.get("level3", {}) - in_dir = work_config.get("in_dir", ".") - - docs_directory = os.path.join(working_directory, in_dir) - model = work_config.get("model", "gpt-3.5-turbo") - query = work_config.get("query", "") - db_directory = os.path.join(working_directory, "chroma_db") - - result = search_with_citation(query, db_directory, model) - console.print(Markdown(result)) - - -if __name__ == "__main__": - main() diff --git a/data/log.txt b/data/log.txt index dd4be2c..2e9c8ea 100644 --- a/data/log.txt +++ b/data/log.txt @@ -1,317 +1,18 @@ -[23:27:12] Iniciando ejecución de x1.py -[23:27:12] Working directory: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta -[23:27:12] Input directory: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta -[23:27:12] Output directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032 -[23:27:12] Output file: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\contenidoImportado.md -[23:27:12] Attachments directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos -[23:27:12] Found 1 HTML files -[23:27:12] Processing [1/1] C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv.htm -[23:27:12] Procesando imágenes desde C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv.htm -[23:27:12] Directorio base: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta -[23:27:12] Directorio adjuntos: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image001.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image001.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image001.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image001.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image002.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image002.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image002.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image002.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image003.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image003.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image003.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image003.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image004.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image004.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image004.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image004.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image005.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image005.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image005.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image005.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image006.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image006.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image006.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image006.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image007.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image007.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image007.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image007.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image008.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image008.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image008.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image008.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image009.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image009.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image009.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image009.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image010.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image010.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image010.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image010.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image011.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image011.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image011.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image011.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image012.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image012.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image012.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image012.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image013.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image013.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image013.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image013.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image014.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image014.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image014.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image014.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image015.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image015.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image015.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image015.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image016.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image016.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image016.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image016.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image017.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image017.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image017.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image017.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image018.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image018.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image018.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image018.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image019.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image019.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image019.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image019.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image020.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image020.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image020.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image020.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image021.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image021.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image021.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image021.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image022.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image022.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image022.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image022.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image023.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image023.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image023.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image023.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image024.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image024.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image024.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image024.png -[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image025.png -[23:27:12] Buscando imagen en: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image025.png -[23:27:12] Copiando imagen de C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta\FDM RNF032 E5.007299 - mv_archivos\image025.png a C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos\image025.png -[23:27:12] Resumen de procesamiento de imágenes: -[23:27:12] - Imágenes procesadas con éxito: 25 -[23:27:12] - Imágenes no encontradas: 0 -[23:27:12] - Imágenes con error de procesamiento: 0 -[23:27:12] - Total de imágenes encontradas en HTML: 25 -[23:27:12] - Nombres de archivos de imágenes procesadas: ['image001.png', 'image002.png', 'image003.png', 'image004.png', 'image005.png', 'image006.png', 'image007.png', 'image008.png', 'image009.png', 'image010.png', 'image011.png', 'image012.png', 'image013.png', 'image014.png', 'image015.png', 'image016.png', 'image017.png', 'image018.png', 'image019.png', 'image020.png', 'image021.png', 'image022.png', 'image023.png', 'image024.png', 'image025.png'] -[23:27:12] Referencias de imagen en Markdown: 0 -[23:27:12] Archivos de debug guardados -[23:27:12] ✅ Success: Foglio di Modifica -[23:27:12] Summary: -[23:27:12] - Total files: 1 -[23:27:12] - Successfully processed: 1 -[23:27:12] - Failed: 0 -[23:27:12] Writing 1 pages to C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\contenidoImportado.md -[23:27:12] Markdown file created successfully. -[23:27:13] Ejecución completada -[23:33:56] Iniciando ejecución de x1.py -[23:33:57] Working directory: C:\Users\migue\Downloads\Nueva carpeta (7) -[23:33:57] Input directory: C:\Users\migue\Downloads\Nueva carpeta (7) -[23:33:57] Output directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/01-Documentation/SIDEL/MASTER/Communication -[23:33:57] Output file: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/01-Documentation/SIDEL/MASTER/Communication\contenidoImportado.md -[23:33:57] Attachments directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/01-Documentation/SIDEL/MASTER/Communication\adjuntos -[23:33:57] Found 1 HTML files -[23:33:57] Processing [1/1] C:\Users\migue\Downloads\Nueva carpeta (7)\TIA Portal Ethernet communication Rules V0.1.htm -[23:33:57] Procesando imágenes desde C:\Users\migue\Downloads\Nueva carpeta (7)\TIA Portal Ethernet communication Rules V0.1.htm -[23:33:57] Directorio base: C:\Users\migue\Downloads\Nueva carpeta (7) -[23:33:57] Directorio adjuntos: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/01-Documentation/SIDEL/MASTER/Communication\adjuntos -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image002.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image002.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image004.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image004.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image006.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image006.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image008.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image008.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image009.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image009.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image010.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image010.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image011.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image011.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image013.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image013.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image015.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image015.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image016.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image016.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image018.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image018.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image020.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image020.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image021.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image021.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image023.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image023.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image025.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image025.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image021.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image021.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image027.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image027.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image029.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image029.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image030.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image030.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image031.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image031.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image032.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image032.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image035.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image035.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image037.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image037.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image038.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image038.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image040.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image040.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image042.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image042.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image043.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image043.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image045.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image045.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image047.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image047.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image049.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image049.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image043.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image043.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image051.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image051.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image055.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image055.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image043.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image043.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image057.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image057.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image059.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image059.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image061.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image061.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image062.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image062.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image064.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image064.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image065.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image065.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image066.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image066.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image067.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image067.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image069.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image069.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image071.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image071.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image072.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image072.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image074.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image074.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image076.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image076.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image078.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image078.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image083.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image083.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image084.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image084.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image086.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image086.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image087.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image087.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image088.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image088.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image090.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image090.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image091.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image091.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image093.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image093.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image095.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image095.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image097.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image097.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image099.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image099.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image101.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image101.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image102.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image102.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image104.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image104.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image106.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image106.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image109.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image109.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image110.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image110.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image110.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image110.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image113.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image113.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image114.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image114.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image115.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image115.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image118.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image118.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image125.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image125.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image079.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image079.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image131.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image131.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image132.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image132.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image138.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image138.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image139.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image139.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image140.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image140.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image141.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image141.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image091.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image091.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image145.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image145.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image146.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image146.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image140.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image140.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image147.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image147.gif -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image091.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image091.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image149.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image149.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image151.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image151.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image152.jpg -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image152.jpg -[23:33:57] Procesando imagen HTML: TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos/image154.gif -[23:33:57] Imagen no encontrada: C:\Users\migue\Downloads\Nueva carpeta (7)\TIA%20Portal%20Ethernet%20communication%20Rules%20V0.1_archivos\image154.gif -[23:33:57] Resumen de procesamiento de imágenes: -[23:33:57] - Imágenes procesadas con éxito: 94 -[23:33:57] - Imágenes no encontradas: 94 -[23:33:57] - Imágenes con error de procesamiento: 0 -[23:33:57] - Total de imágenes encontradas en HTML: 188 -[23:33:57] - Nombres de archivos de imágenes procesadas: [] -[23:33:58] Referencias de imagen en Markdown: 0 -[23:33:58] Archivos de debug guardados -[23:33:58] ✅ Success: Microsoft Word - TIA Portal Ethernet communication Rules.docx -[23:33:58] Summary: -[23:33:58] - Total files: 1 -[23:33:58] - Successfully processed: 1 -[23:33:58] - Failed: 0 -[23:33:58] Writing 1 pages to C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/01-Documentation/SIDEL/MASTER/Communication\contenidoImportado.md -[23:33:58] Markdown file created successfully. -[23:33:58] Ejecución completada +[13:09:20] Iniciando ejecución de x1.py +[13:09:21] Working directory: C:\Users\migue\Downloads\Nueva carpeta (7) +[13:09:21] Input directory: C:\Users\migue\Downloads\Nueva carpeta (7) +[13:09:21] Output directory: . +[13:09:21] Output file: .\contenidoImportado.md +[13:09:21] Attachments directory: .\adjuntos +[13:09:21] Found 0 HTML files +[13:09:21] Found 1 DOCX files +[13:09:21] Processing DOCX [1/1] C:\Users\migue\Downloads\Nueva carpeta (7)\TIA Portal Ethernet communication Rules V0.1.docx +[13:09:22] Error procesando DOCX C:\Users\migue\Downloads\Nueva carpeta (7)\TIA Portal Ethernet communication Rules V0.1.docx: convert_document_element_to_html() got an unexpected keyword argument 'options' +[13:09:22] [ERROR] Failed: Error al procesar: convert_document_element_to_html() got an unexpected keyword argument 'options' +[13:09:22] Summary: +[13:09:22] - Total files: 1 +[13:09:22] - Successfully processed: 0 +[13:09:22] - Failed: 1 +[13:09:22] Writing 1 pages to .\contenidoImportado.md +[13:09:22] Markdown file created successfully. +[13:09:23] Ejecución completada