fabgel's picture
Primo caricamento
5d09c7c verified
import gradio as gr
import pandas as pd
from collections import defaultdict
import os
# --- Le nostre funzioni di logica (non cambiano!) ---
def parse_all_rules(lines):
structured_rules = []
current_conditions = []
for line in lines:
line = line.strip()
if not line: continue
if line.startswith('RewriteCond'):
current_conditions.append(line)
elif line.startswith('RewriteRule'):
parts = line.split()
source_url = parts[1] if len(parts) > 1 else ""
destination_url = parts[2] if len(parts) > 2 else ""
full_block_text = "\n".join(current_conditions + [line])
structured_rules.append({
"full_block": full_block_text,
"source": source_url,
"destination": destination_url
})
current_conditions = []
return structured_rules
def find_duplicate_sources(structured_rules):
source_to_destinations = defaultdict(set)
for rule in structured_rules:
if rule["source"]:
source_to_destinations[rule["source"]].add(rule["destination"])
duplicate_sources = {
source for source, destinations in source_to_destinations.items()
if len(destinations) > 1
}
return duplicate_sources
# --- La funzione principale per l'interfaccia Gradio ---
def analyze_and_create_report(uploaded_file):
if uploaded_file is None:
return (
pd.DataFrame(), # Tabella anteprima vuota
None, # Nessun file da scaricare
"Nessun file caricato. Per favore, carica un file .txt" # Messaggio di stato
)
# Leggi le righe dal file temporaneo caricato da Gradio
with open(uploaded_file.name, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 1. Analizza e struttura TUTTE le regole
all_rules = parse_all_rules(lines)
# 2. Identifica gli URL di partenza duplicati
duplicate_sources = find_duplicate_sources(all_rules)
# 3. Prepara i dati per l'output
output_data = []
for rule in all_rules:
if rule["source"] in duplicate_sources:
output_data.append({
"Rewrite Rule Originale": rule["full_block"],
"URL di Partenza (Isolato)": rule["source"],
"URL di Destinazione (Isolato)": rule["destination"]
})
else:
output_data.append({
"Rewrite Rule Originale": rule["full_block"],
"URL di Partenza (Isolato)": "",
"URL di Destinazione (Isolato)": ""
})
if not output_data:
return pd.DataFrame(), None, "Il file sembra vuoto o non contiene regole valide."
# 4. Crea un DataFrame pandas e un file CSV
df = pd.DataFrame(output_data)
# Crea un file CSV temporaneo per il download
output_filename = "report_duplicati.csv"
df.to_csv(output_filename, index=False, sep=';')
# Prepara l'anteprima (solo duplicati) e messaggio di stato
preview_df = df[df["URL di Partenza (Isolato)"] != ""]
if len(duplicate_sources) > 0:
status_message = f"✅ Analisi completata. Trovati {len(duplicate_sources)} URL di partenza con destinazioni multiple. Scarica il report completo."
else:
status_message = "✅ Analisi completata. Nessuna regola duplicata trovata! Il report CSV conterrà tutte le regole originali."
# Restituisce l'anteprima, il percorso del file da scaricare e il messaggio di stato
return preview_df, output_filename, status_message
# --- Costruzione dell'interfaccia Gradio ---
with gr.Blocks() as demo:
gr.Markdown("# 📄 Generatore Report CSV per Rewrite Rules Duplicate")
gr.Markdown(
"Carica un file .txt per analizzare le Rewrite Rules. "
"Il tool genererà un file CSV scaricabile con i risultati."
)
with gr.Row():
file_input = gr.File(label="Carica il tuo file .txt", file_types=[".txt"])
analyze_button = gr.Button("Analizza File", variant="primary")
status_output = gr.Textbox(label="Stato dell'Analisi")
gr.Markdown("### Anteprima delle Regole Duplicate Trovate")
preview_output = gr.DataFrame(headers=["Rewrite Rule Originale", "URL di Partenza (Isolato)", "URL di Destinazione (Isolato)"])
gr.Markdown("### Scarica il Report Completo")
file_output = gr.File(label="Clicca sull'icona di download per scaricare il file CSV")
analyze_button.click(
fn=analyze_and_create_report,
inputs=file_input,
outputs=[preview_output, file_output, status_output]
)
# --- Avvio dell'applicazione ---
if __name__ == "__main__":
# Aggiungi share=True per creare un link pubblico e temporaneo
demo.launch(share=True)