const statusEl = document.getElementById("status"); const logEl = document.getElementById("log"); const downloadsEl = document.getElementById("downloads"); const runBtn = document.getElementById("runBtn"); let pyodide = null; async function initPyodide() { statusEl.textContent = "Chargement de Pyodide ... (cela peut prendre 10-20s la première fois)"; pyodide = await loadPyodide(); statusEl.textContent = "Pyodide chargé. Installation de dépendances (openpyxl)..."; await pyodide.loadPackage("micropip"); const micropip = pyodide.pyimport("micropip"); await micropip.install("openpyxl"); statusEl.textContent = "Prêt — openpyxl installé."; //load micropip qui permet d'accéder a openpyxl qui sert a écrire dans les excels. } // load Pyodide script tag dynamically (async () => { const s = document.createElement("script"); s.src = "https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js"; s.onload = async () => { await initPyodide(); }; document.head.appendChild(s); })(); function log(msg) { logEl.textContent += msg + "\n"; logEl.scrollTop = logEl.scrollHeight; } function createDownloadLink(filename, bytes) { // bytes is Uint8Array or ArrayBuffer-like const blob = new Blob([bytes], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; a.textContent = `Download ${filename}`; downloadsEl.appendChild(a); } runBtn.addEventListener("click", async () => { downloadsEl.innerHTML = ""; logEl.textContent = ""; if (!pyodide) { alert("Pyodide n'est pas encore prêt."); return; } const templateFile = document.getElementById("template_excel").files[0]; const txtFile = document.getElementById("txt_input").files[0]; const typeDoc = document.getElementById("typedoc").value; const nom_releveur = document.getElementById("nom_releveur").value || ""; const hauteur_bosch = document.getElementById("hauteur_bosch").value || "0"; if (!templateFile) { alert("Veuillez uploader le template Excel."); return; } if (!txtFile) { alert("Veuillez uploader le fichier texte."); return; } statusEl.textContent = "Lecture des fichiers (navigateur)..."; // read files on JS side const [tmplBuf, txtStr] = await Promise.all([ templateFile.arrayBuffer(), txtFile.text() ]); // pass into pyodide globals: // set template bytes as a Uint8Array in globals so Python can get bytes via to_py() pyodide.globals.set("template_uint8", new Uint8Array(tmplBuf)); pyodide.globals.set("txt_content", txtStr); pyodide.globals.set("typeDoc", typeDoc); pyodide.globals.set("nom_du_releveur", nom_releveur); pyodide.globals.set("hauteur_bosch", hauteur_bosch); statusEl.textContent = "Exécution du script Python (Pyodide)..."; log("Lancement du traitement..."); try { const response = await fetch('UDS - Copie.py'); const python_core_code = await response.text(); await pyodide.runPythonAsync(python_core_code); statusEl.textContent = "Terminé — fichiers générés."; log("Terminé."); } catch (err) { console.error(err); statusEl.textContent = "Erreur pendant l'exécution (voir log)."; log("ERREUR: " + err); } finally { try { pyodide.globals.delete("template_uint8"); pyodide.globals.delete("txt_content"); pyodide.globals.delete("typeDoc"); pyodide.globals.delete("nom_du_releveur"); pyodide.globals.delete("hauteur_bosch"); } catch(e) {} } });