103 lines
3.3 KiB
Python
Executable File
103 lines
3.3 KiB
Python
Executable File
"""
|
|
Main - Script principal para processamento de documentos
|
|
Descomplicar - Agência de Aceleração Digital
|
|
https://www.descomplicar.pt
|
|
"""
|
|
|
|
import os
|
|
import argparse
|
|
from urllib.parse import urlparse
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from processors.pdf_processor import PDFProcessor
|
|
from processors.txt_processor import TXTProcessor
|
|
from processors.web_processor import WebProcessor
|
|
from enrichment.faq_generator import FAQGenerator
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
def is_url(string: str) -> bool:
|
|
"""
|
|
Verifica se uma string é uma URL válida.
|
|
|
|
Args:
|
|
string (str): String a verificar
|
|
|
|
Returns:
|
|
bool: True se for URL, False caso contrário
|
|
"""
|
|
try:
|
|
result = urlparse(string)
|
|
return all([result.scheme, result.netloc])
|
|
except ValueError:
|
|
return False
|
|
|
|
def process_document(input_path: str, output_file: str = None) -> None:
|
|
"""
|
|
Processa um documento e gera o output formatado.
|
|
|
|
Args:
|
|
input_path (str): Caminho do ficheiro ou URL de entrada
|
|
output_file (str): Caminho do ficheiro de saída (opcional)
|
|
"""
|
|
# Verificar se é URL ou ficheiro local
|
|
if is_url(input_path):
|
|
processor = WebProcessor(input_path)
|
|
else:
|
|
# Determinar tipo de ficheiro
|
|
file_ext = os.path.splitext(input_path)[1].lower()
|
|
|
|
# Selecionar processador apropriado
|
|
if file_ext == '.pdf':
|
|
processor = PDFProcessor(input_path)
|
|
elif file_ext in ['.txt', '.md']:
|
|
processor = TXTProcessor(input_path)
|
|
else:
|
|
raise ValueError(f"Tipo de ficheiro não suportado: {file_ext}")
|
|
|
|
try:
|
|
# Processar conteúdo
|
|
processor.process_content()
|
|
|
|
# Gerar FAQs para cada capítulo
|
|
faq_gen = FAQGenerator()
|
|
for chapter in processor.chapters:
|
|
faqs = faq_gen.generate_faqs(chapter['content'])
|
|
chapter['faqs'] = faqs
|
|
|
|
# Definir ficheiro de saída se não especificado
|
|
if not output_file:
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
if is_url(input_path):
|
|
base_name = urlparse(input_path).netloc.replace('.', '_')
|
|
else:
|
|
base_name = os.path.splitext(os.path.basename(input_path))[0]
|
|
|
|
# Usar caminho absoluto
|
|
output_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "output")
|
|
output_file = os.path.join(output_dir, f"{base_name}_{timestamp}.md")
|
|
|
|
# Criar diretório de saída se não existir
|
|
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
|
|
|
# Salvar resultado
|
|
processor.save_markdown(output_file)
|
|
print(f"Documento processado com sucesso: {output_file}")
|
|
|
|
except Exception as e:
|
|
print(f"Erro ao processar documento: {str(e)}")
|
|
raise
|
|
|
|
def main():
|
|
"""Função principal."""
|
|
parser = argparse.ArgumentParser(description='Processador de documentos com geração de FAQs')
|
|
parser.add_argument('input', help='Ficheiro de entrada ou URL')
|
|
parser.add_argument('-o', '--output', help='Ficheiro de saída (opcional)')
|
|
|
|
args = parser.parse_args()
|
|
process_document(args.input, args.output)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|