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 03f75d6..9d54b8c 100644
Binary files a/backend/script_groups/ImportHTML/models/__pycache__/pagina_html.cpython-310.pyc and b/backend/script_groups/ImportHTML/models/__pycache__/pagina_html.cpython-310.pyc differ
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 0000000..016aa94
Binary files /dev/null and b/backend/script_groups/ImportHTML/utils/__pycache__/docx_converter.cpython-310.pyc differ
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 2fd27fc..91472f8 100644
Binary files a/backend/script_groups/ImportHTML/utils/__pycache__/html_parser.cpython-310.pyc and b/backend/script_groups/ImportHTML/utils/__pycache__/html_parser.cpython-310.pyc differ
diff --git a/backend/script_groups/ImportHTML/utils/docx_converter.py b/backend/script_groups/ImportHTML/utils/docx_converter.py
new file mode 100644
index 0000000..083c58b
--- /dev/null
+++ b/backend/script_groups/ImportHTML/utils/docx_converter.py
@@ -0,0 +1,150 @@
+# utils/docx_converter.py
+import os
+import re
+import mammoth
+from pathlib import Path
+from models.pagina_html import PaginaHTML
+
+def procesar_docx(ruta_archivo, dir_adjuntos):
+ """
+ Procesa un archivo DOCX y lo convierte directamente a Markdown,
+ extrayendo las imágenes al directorio de adjuntos.
+ """
+ # Asegurar que el directorio de adjuntos existe
+ os.makedirs(dir_adjuntos, exist_ok=True)
+
+ # Lista para almacenar imágenes procesadas
+ imagenes_procesadas = []
+
+ def manejar_imagen(image):
+ """Procesa cada imagen encontrada en el documento DOCX."""
+ try:
+ # Generar nombre de archivo para la imagen
+ extension = image.content_type.split('/')[-1] if hasattr(image, 'content_type') else 'png'
+ if extension == 'jpeg':
+ extension = 'jpg'
+
+ # Usar alt_text si está disponible o generar nombre basado en índice
+ filename = (image.alt_text if hasattr(image, 'alt_text') and image.alt_text
+ else f"image-{len(imagenes_procesadas)+1}.{extension}")
+
+ # Asegurar que el nombre sea válido para el sistema de archivos
+ filename = re.sub(r'[<>:"/\\|?*]', "_", 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"", "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