ParamManagerScripts/backend/script_groups/ImportHTML/x1.py

164 lines
6.0 KiB
Python

"""
Script para importar archivos HTML o DOCX y convertirlos a un archivo Markdown.
"""
import os
import sys
from pathlib import Path
import json
from utils.html_parser import procesar_html
from utils.markdown_handler import escribir_archivo_markdown
# Verificar si la biblioteca mammoth está disponible para procesamiento DOCX
try:
from utils.docx_converter import procesar_docx
DOCX_SUPPORT = True
except ImportError:
DOCX_SUPPORT = False
print("Nota: Soporte para DOCX no disponible. Instale mammoth para habilitar esta función.")
# Forzar UTF-8 en la salida estándar
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():
# 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", {})
output_file = group_config.get("output_file", "contenido.md")
attachments_dir = group_config.get("attachments_dir", "adjuntos")
# Obtener directorio de salida (nivel 3)
work_config = configs.get("level3", {})
output_directory = work_config.get("output_directory", ".")
# Construir rutas absolutas
input_dir = (
working_directory # El directorio de trabajo es el directorio de entrada
)
output_path = os.path.join(output_directory, output_file)
attachments_path = os.path.join(output_directory, attachments_dir)
# Debug prints
print(f"Working directory: {working_directory}")
print(f"Input directory: {input_dir}")
print(f"Output directory: {output_directory}")
print(f"Output file: {output_path}")
print(f"Attachments directory: {attachments_path}")
# Asegurar que existen los directorios
os.makedirs(attachments_path, exist_ok=True)
# Verificar si el directorio de entrada existe
input_path = Path(input_dir)
if not input_path.exists():
print(f"Error: Input directory {input_path} does not exist")
return
# Buscar archivos HTML y DOCX
html_files = []
docx_files = []
# Buscar archivos HTML
for ext in ["*.html", "*.htm"]:
html_files.extend(list(input_path.glob(ext)))
# Buscar archivos DOCX si el soporte está disponible
if DOCX_SUPPORT:
for ext in ["*.docx", "*.doc"]:
docx_files.extend(list(input_path.glob(ext)))
print(f"Found {len(html_files)} HTML files")
if DOCX_SUPPORT:
print(f"Found {len(docx_files)} DOCX files")
if not html_files and not docx_files:
print("No compatible files found in the input directory.")
return
# Procesar archivos
paginas = []
total_files = len(html_files) + len(docx_files)
successful_files = 0
failed_files = 0
# Procesar archivos HTML
for i, archivo in enumerate(html_files, 1):
print(f"\nProcessing HTML [{i}/{total_files}] {archivo}")
try:
pagina = procesar_html(archivo, attachments_path)
if pagina:
paginas.append(pagina)
# Verificar si hubo error al procesar
if pagina.contenido.startswith("Error al procesar:"):
failed_files += 1
titulo_seguro = str(pagina.contenido).encode('ascii', 'replace').decode('ascii')
print(f"{ERROR_SYMBOL} Failed: {titulo_seguro}")
else:
successful_files += 1
# Usar codificación ascii para evitar problemas de caracteres
titulo_seguro = str(pagina.titulo).encode('ascii', 'replace').decode('ascii')
print(f"{SUCCESS_SYMBOL} Success: {titulo_seguro}")
except Exception as e:
failed_files += 1
print(f"{ERROR_SYMBOL} Error processing HTML file: {str(e)}")
# Procesar archivos DOCX si el soporte está disponible
if DOCX_SUPPORT:
for i, archivo in enumerate(docx_files, len(html_files) + 1):
print(f"\nProcessing DOCX [{i}/{total_files}] {archivo}")
try:
pagina = procesar_docx(archivo, attachments_path)
if pagina:
paginas.append(pagina)
if pagina.contenido.startswith("Error al procesar:"):
failed_files += 1
titulo_seguro = str(pagina.contenido).encode('ascii', 'replace').decode('ascii')
print(f"{ERROR_SYMBOL} Failed: {titulo_seguro}")
else:
successful_files += 1
titulo_seguro = str(pagina.titulo).encode('ascii', 'replace').decode('ascii')
print(f"{SUCCESS_SYMBOL} Success: {titulo_seguro}")
except Exception as e:
failed_files += 1
error_msg = str(e).encode('ascii', 'replace').decode('ascii')
print(f"{ERROR_SYMBOL} Error processing DOCX file: {error_msg}")
# Crear página con error
from models.pagina_html import PaginaHTML
error_pagina = PaginaHTML(
ruta_archivo=archivo,
contenido=f"Error al procesar DOCX: {str(e)}"
)
paginas.append(error_pagina)
# Escribir el archivo Markdown
if paginas:
print(f"\nSummary:")
print(f"- Total files: {total_files}")
print(f"- Successfully processed: {successful_files}")
print(f"- Failed: {failed_files}")
print(f"\nWriting {len(paginas)} pages to {output_path}")
if escribir_archivo_markdown(paginas, output_path):
print("Markdown file created successfully.")
else:
print("Error creating Markdown file.")
else:
print("No pages to write.")
if __name__ == "__main__":
main()