File size: 4,831 Bytes
5d09c7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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)