Antes de cambiar la forma de comunicar los datos a los scripts.
This commit is contained in:
parent
456c5cc1c7
commit
c2c1c13729
Binary file not shown.
|
@ -49,13 +49,13 @@ class PaginaHTML:
|
||||||
|
|
||||||
# Contenido
|
# Contenido
|
||||||
md = f"{hash_line}{titulo_line}{origen_line}"
|
md = f"{hash_line}{titulo_line}{origen_line}"
|
||||||
|
|
||||||
# Limpiar cualquier artefacto de asteriscos extra antes de agregar el contenido
|
# Limpiar cualquier artefacto de asteriscos extra antes de agregar el contenido
|
||||||
contenido_limpio = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", self.contenido)
|
contenido_limpio = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", self.contenido)
|
||||||
md += contenido_limpio + "\n\n"
|
md += contenido_limpio + "\n\n"
|
||||||
|
|
||||||
# Ya no se agregan imágenes al final - se asume que están en el contenido
|
# Ya no se agregan imágenes al final - se asume que están en el contenido
|
||||||
|
|
||||||
md += "---\n\n"
|
md += "---\n\n"
|
||||||
|
|
||||||
return md
|
return md
|
||||||
|
@ -67,7 +67,7 @@ class PaginaHTML:
|
||||||
slug = re.sub(r"\s+", "-", slug)
|
slug = re.sub(r"\s+", "-", slug)
|
||||||
|
|
||||||
return f"- [{self.titulo}](#{slug})"
|
return f"- [{self.titulo}](#{slug})"
|
||||||
|
|
||||||
def add_imagen(self, imagen):
|
def add_imagen(self, imagen):
|
||||||
"""Añade una referencia a una imagen asociada a esta página."""
|
"""Añade una referencia a una imagen asociada a esta página."""
|
||||||
if imagen not in self.imagenes:
|
if imagen not in self.imagenes:
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
beautifulsoup4==4.10.0
|
beautifulsoup4==4.12.2
|
||||||
html2text==2020.1.16
|
html2text==2020.1.16
|
||||||
requests==2.28.1
|
requests==2.31.0
|
||||||
|
pypandoc==1.11
|
||||||
|
mammoth==1.6.0
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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
|
|
@ -7,14 +7,24 @@ from bs4 import BeautifulSoup
|
||||||
from urllib.parse import urlparse, unquote
|
from urllib.parse import urlparse, unquote
|
||||||
import requests
|
import requests
|
||||||
import shutil
|
import shutil
|
||||||
import html2text # Añadir esta librería
|
|
||||||
from models.pagina_html import PaginaHTML
|
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):
|
def procesar_html(ruta_archivo, dir_adjuntos):
|
||||||
"""
|
"""
|
||||||
Procesa un archivo HTML y lo convierte a Markdown, descargando
|
Procesa un archivo HTML y lo convierte a Markdown, descargando
|
||||||
las imágenes a la carpeta de adjuntos.
|
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
|
# Lista de encodings para intentar
|
||||||
encodings = ["utf-8", "latin-1", "iso-8859-1", "windows-1252", "cp1252"]
|
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
|
# Obtener la lista de imágenes procesadas
|
||||||
imagenes_procesadas = procesar_imagenes(soup, dir_adjuntos, ruta_archivo)
|
imagenes_procesadas = procesar_imagenes(soup, dir_adjuntos, ruta_archivo)
|
||||||
|
|
||||||
# Procesar tablas
|
# Preprocesar elementos específicos de Word
|
||||||
procesar_tablas(soup)
|
preprocesar_elementos_word(soup)
|
||||||
|
|
||||||
# Convertir HTML a Markdown
|
# 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
|
# Crear la página HTML con la lista de imágenes
|
||||||
return PaginaHTML(
|
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
|
Preprocesa elementos específicos de Word para mejorar la conversión.
|
||||||
de adjuntos y actualizando las rutas.
|
|
||||||
"""
|
"""
|
||||||
# Crear directorio si no existe
|
# Eliminar metadatos y scripts
|
||||||
os.makedirs(dir_adjuntos, exist_ok=True)
|
for tag in soup.select('style, script, meta, link'):
|
||||||
|
tag.decompose()
|
||||||
# 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 = []
|
|
||||||
|
|
||||||
# Contador de imágenes procesadas
|
# Intentar limpiar elementos Office específicos
|
||||||
num_imagenes_procesadas = 0
|
for tag in soup.find_all(['o:p']):
|
||||||
imagenes_no_encontradas = 0
|
if tag.string:
|
||||||
imagenes_con_error = 0
|
# Preservar solo el texto
|
||||||
|
tag.replace_with(soup.new_string(tag.get_text()))
|
||||||
# Procesar imágenes estándar HTML
|
else:
|
||||||
for img in soup.find_all("img"):
|
tag.decompose()
|
||||||
src = img.get("src")
|
|
||||||
if not src:
|
# Convertir elementos VML a elementos HTML estándar
|
||||||
continue
|
for shape in soup.find_all(['v:shape', 'v:imagedata']):
|
||||||
|
# Extraer cualquier imagen dentro del shape
|
||||||
try:
|
img_tags = shape.find_all('img')
|
||||||
print(f"Procesando imagen HTML: {src}")
|
if img_tags:
|
||||||
# Determinar si es URL o ruta local
|
for img in img_tags:
|
||||||
if src.startswith(("http://", "https://")):
|
# Mover la imagen fuera del shape
|
||||||
# Es una URL remota
|
if shape.parent:
|
||||||
nombre_archivo = os.path.basename(urlparse(src).path)
|
shape.parent.insert_before(img)
|
||||||
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 <hr> 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"]
|
|
||||||
|
|
||||||
# Verificar si la tabla tiene encabezados
|
# Extraer cualquier texto significativo
|
||||||
has_headers = False
|
text_content = shape.get_text().strip()
|
||||||
rows = table.find_all("tr")
|
if text_content and shape.parent:
|
||||||
if rows:
|
text_node = soup.new_tag('p')
|
||||||
first_row_cells = rows[0].find_all(["th"])
|
text_node.string = text_content
|
||||||
has_headers = len(first_row_cells) > 0
|
shape.parent.insert_before(text_node)
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
|
|
||||||
|
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
|
# Configurar el conversor html2text
|
||||||
h2t = html2text.HTML2Text()
|
h2t = html2text.HTML2Text()
|
||||||
h2t.body_width = 0 # No limitar el ancho del cuerpo del texto
|
h2t.body_width = 0 # No limitar el ancho del cuerpo del texto
|
||||||
h2t.ignore_links = False
|
h2t.ignore_links = False
|
||||||
h2t.ignore_images = False
|
h2t.ignore_images = False
|
||||||
h2t.ignore_emphasis = False
|
h2t.ignore_emphasis = False
|
||||||
h2t.ignore_tables = False # Importante para mantener tablas
|
h2t.ignore_tables = False
|
||||||
h2t.bypass_tables = False # No saltarse las tablas
|
h2t.bypass_tables = False
|
||||||
h2t.mark_code = True
|
h2t.mark_code = True
|
||||||
h2t.unicode_snob = True # Preservar caracteres Unicode
|
h2t.unicode_snob = True
|
||||||
h2t.open_quote = '"'
|
|
||||||
h2t.close_quote = '"'
|
|
||||||
h2t.use_automatic_links = True # Mejorar manejo de enlaces
|
|
||||||
|
|
||||||
# Personalizar el manejo de imágenes para formato Obsidian
|
# Procesar tablas para prepararlas para conversión
|
||||||
def custom_image_formatter(src, alt, title):
|
for table in soup.find_all("table"):
|
||||||
# Obtener solo el nombre del archivo
|
# Agregar clase para mejor reconocimiento
|
||||||
filename = os.path.basename(src)
|
table["class"] = table.get("class", []) + ["md-table"]
|
||||||
# Retornar el formato Obsidian
|
|
||||||
return f"![[{filename}]]"
|
# 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
|
# Convertir a Markdown
|
||||||
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
|
|
||||||
html_content = str(soup)
|
html_content = str(soup)
|
||||||
markdown_content = h2t.handle(html_content)
|
markdown_content = h2t.handle(html_content)
|
||||||
|
|
||||||
# Post-procesamiento: convertir cualquier sintaxis de imagen estándar que quede al formato Obsidian
|
return markdown_content
|
||||||
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 "<table" in html_content and "| " not in markdown_content:
|
|
||||||
print("Detectada tabla pero no se convirtió correctamente. Aplicando conversión manual...")
|
|
||||||
# Volver a procesar tablas manualmente
|
|
||||||
table_pattern = re.compile(r'<table.*?>(.*?)</table>', re.DOTALL)
|
|
||||||
tables = table_pattern.findall(html_content)
|
|
||||||
|
|
||||||
for i, table_html in enumerate(tables):
|
|
||||||
soup_table = BeautifulSoup(f"<table>{table_html}</table>", "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"(?<!\n)(\*{2,}|\-{2,})(?!\n)", " ", markdown_content)
|
|
||||||
|
|
||||||
# 7. Arreglar formato de tablas mal formadas (líneas que empiezan con | pero no son tablas completas)
|
|
||||||
markdown_content = re.sub(r"^\|[^\n]*\|[^\n]*$", "", markdown_content, flags=re.MULTILINE)
|
|
||||||
|
|
||||||
# Contar cuántas referencias de imagen hay en el Markdown generado
|
|
||||||
obsidian_refs = re.findall(r"!\[\[(.*?)\]\]", markdown_content)
|
|
||||||
print(f"Referencias de imagen en Markdown: {len(obsidian_refs)}")
|
|
||||||
if obsidian_refs:
|
|
||||||
print(f"Referencias: {', '.join(obsidian_refs)}")
|
|
||||||
|
|
||||||
# Guardar información de debugging
|
|
||||||
try:
|
|
||||||
with open("debug_html.txt", "w", encoding="utf-8") as f:
|
|
||||||
f.write(debug_html)
|
|
||||||
with open("debug_markdown.txt", "w", encoding="utf-8") as f:
|
|
||||||
f.write(markdown_content)
|
|
||||||
print("Archivos de debug guardados")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error guardando archivos de debug: {str(e)}")
|
|
||||||
|
|
||||||
return markdown_content.strip()
|
|
||||||
|
def post_procesar_markdown(markdown, imagenes_procesadas):
|
||||||
|
"""
|
||||||
|
Post-procesa el Markdown para adaptarlo a formato Obsidian y
|
||||||
|
corregir problemas comunes de conversión.
|
||||||
|
"""
|
||||||
|
# 1. Convertir referencias de imágenes al formato Obsidian
|
||||||
|
for imagen in imagenes_procesadas:
|
||||||
|
# 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. Limpiar líneas excesivas
|
||||||
|
markdown = re.sub(r'\n{3,}', '\n\n', markdown)
|
||||||
|
|
||||||
|
# 3. Arreglar listas mal formadas
|
||||||
|
markdown = re.sub(r'(^|\n)([*\-])([^\s])', r'\1\2 \3', markdown, flags=re.MULTILINE)
|
||||||
|
|
||||||
|
# 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. Eliminar caracteres de control
|
||||||
|
markdown = re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]', '', markdown)
|
||||||
|
|
||||||
|
# 6. Normalizar líneas horizontales
|
||||||
|
markdown = re.sub(r'(\*{3,}|\-{3,}|_{3,})', '---', markdown)
|
||||||
|
|
||||||
|
return markdown
|
||||||
|
|
||||||
|
|
||||||
|
def procesar_imagenes(soup, dir_adjuntos, ruta_archivo_html):
|
||||||
|
"""
|
||||||
|
Procesa todas las imágenes en el HTML, descargándolas al directorio
|
||||||
|
de adjuntos y actualizando las rutas.
|
||||||
|
|
||||||
|
Versión mejorada con manejo simplificado de rutas y mejor
|
||||||
|
detección de imágenes en documentos Word.
|
||||||
|
"""
|
||||||
|
# Crear directorio si no existe
|
||||||
|
os.makedirs(dir_adjuntos, exist_ok=True)
|
||||||
|
|
||||||
|
# Directorio base del archivo HTML
|
||||||
|
dir_base = os.path.dirname(os.path.abspath(ruta_archivo_html))
|
||||||
|
|
||||||
|
# Lista para almacenar imágenes procesadas
|
||||||
|
imagenes_procesadas = []
|
||||||
|
|
||||||
|
# Estadísticas
|
||||||
|
stats = {
|
||||||
|
"procesadas": 0,
|
||||||
|
"no_encontradas": 0,
|
||||||
|
"con_error": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Función auxiliar para procesar una imagen
|
||||||
|
def procesar_imagen(src, img_tag=None):
|
||||||
|
if not src or src.startswith("data:"):
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
print(f"Procesando imagen: {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"
|
||||||
|
|
||||||
|
# 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
|
|
@ -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
|
import os
|
||||||
|
@ -9,8 +9,24 @@ import json
|
||||||
from utils.html_parser import procesar_html
|
from utils.html_parser import procesar_html
|
||||||
from utils.markdown_handler import escribir_archivo_markdown
|
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
|
# 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():
|
def main():
|
||||||
|
@ -52,35 +68,81 @@ def main():
|
||||||
print(f"Error: Input directory {input_path} does not exist")
|
print(f"Error: Input directory {input_path} does not exist")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Buscar archivos HTML
|
# Buscar archivos HTML y DOCX
|
||||||
html_files = []
|
html_files = []
|
||||||
|
docx_files = []
|
||||||
|
|
||||||
|
# Buscar archivos HTML
|
||||||
for ext in ["*.html", "*.htm"]:
|
for ext in ["*.html", "*.htm"]:
|
||||||
html_files.extend(list(input_path.glob(ext)))
|
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")
|
print(f"Found {len(html_files)} HTML files")
|
||||||
|
if DOCX_SUPPORT:
|
||||||
|
print(f"Found {len(docx_files)} DOCX files")
|
||||||
|
|
||||||
if not html_files:
|
if not html_files and not docx_files:
|
||||||
print("No HTML files found in the input directory.")
|
print("No compatible files found in the input directory.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Procesar archivos HTML
|
# Procesar archivos
|
||||||
paginas = []
|
paginas = []
|
||||||
total_files = len(html_files)
|
total_files = len(html_files) + len(docx_files)
|
||||||
successful_files = 0
|
successful_files = 0
|
||||||
failed_files = 0
|
failed_files = 0
|
||||||
|
|
||||||
|
# Procesar archivos HTML
|
||||||
for i, archivo in enumerate(html_files, 1):
|
for i, archivo in enumerate(html_files, 1):
|
||||||
print(f"\nProcessing [{i}/{total_files}] {archivo}")
|
print(f"\nProcessing HTML [{i}/{total_files}] {archivo}")
|
||||||
pagina = procesar_html(archivo, attachments_path)
|
try:
|
||||||
if pagina:
|
pagina = procesar_html(archivo, attachments_path)
|
||||||
paginas.append(pagina)
|
if pagina:
|
||||||
# Verificar si hubo error al procesar
|
paginas.append(pagina)
|
||||||
if pagina.contenido.startswith("Error al procesar:"):
|
# 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
|
failed_files += 1
|
||||||
print(f"❌ Failed: {pagina.contenido}")
|
error_msg = str(e).encode('ascii', 'replace').decode('ascii')
|
||||||
else:
|
print(f"{ERROR_SYMBOL} Error processing DOCX file: {error_msg}")
|
||||||
successful_files += 1
|
# Crear página con error
|
||||||
print(f"✅ Success: {pagina.titulo}")
|
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
|
# Escribir el archivo Markdown
|
||||||
if paginas:
|
if paginas:
|
||||||
|
@ -99,4 +161,4 @@ def main():
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
|
@ -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"
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
|
@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
# Configura tu clave API de OpenAI
|
|
||||||
def openai_api_key():
|
|
||||||
return 'sk-HIY5DSK03Lr'
|
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"path": "D:\\Proyectos\\Scripts\\RAG\\TEST",
|
|
||||||
"history": [
|
|
||||||
"D:\\Proyectos\\Scripts\\RAG\\TEST"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -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()
|
|
|
@ -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()
|
|
335
data/log.txt
335
data/log.txt
|
@ -1,317 +1,18 @@
|
||||||
[23:27:12] Iniciando ejecución de x1.py
|
[13:09:20] 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
|
[13:09:21] Working directory: C:\Users\migue\Downloads\Nueva carpeta (7)
|
||||||
[23:27:12] Input directory: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta
|
[13:09:21] Input directory: C:\Users\migue\Downloads\Nueva carpeta (7)
|
||||||
[23:27:12] Output directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032
|
[13:09:21] Output directory: .
|
||||||
[23:27:12] Output file: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\contenidoImportado.md
|
[13:09:21] Output file: .\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
|
[13:09:21] Attachments directory: .\adjuntos
|
||||||
[23:27:12] Found 1 HTML files
|
[13:09:21] Found 0 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
|
[13:09:21] Found 1 DOCX files
|
||||||
[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
|
[13:09:21] Processing DOCX [1/1] C:\Users\migue\Downloads\Nueva carpeta (7)\TIA Portal Ethernet communication Rules V0.1.docx
|
||||||
[23:27:12] Directorio base: C:\Trabajo\SIDEL\04 - E5.007299 - Modifica O&U - RNF032\Entregar\NEW\Nueva carpeta
|
[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'
|
||||||
[23:27:12] Directorio adjuntos: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032\adjuntos
|
[13:09:22] [ERROR] Failed: Error al procesar: convert_document_element_to_html() got an unexpected keyword argument 'options'
|
||||||
[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image001.png
|
[13:09:22] Summary:
|
||||||
[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
|
[13:09:22] - Total files: 1
|
||||||
[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
|
[13:09:22] - Successfully processed: 0
|
||||||
[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image002.png
|
[13:09:22] - Failed: 1
|
||||||
[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
|
[13:09:22] Writing 1 pages to .\contenidoImportado.md
|
||||||
[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
|
[13:09:22] Markdown file created successfully.
|
||||||
[23:27:12] Procesando imagen VML: FDM%20RNF032%20E5.007299%20-%20mv_archivos/image003.png
|
[13:09:23] Ejecución completada
|
||||||
[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
|
|
||||||
|
|
Loading…
Reference in New Issue