Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,13 +1,22 @@
|
|
1 |
-
from flask import Flask, request, render_template
|
2 |
import google.generativeai as genai
|
3 |
import os
|
4 |
from PIL import Image
|
5 |
import io
|
|
|
|
|
|
|
|
|
6 |
|
7 |
app = Flask(__name__)
|
|
|
|
|
8 |
|
9 |
# Configuration de l'API Gemini
|
10 |
token = os.environ.get("TOKEN")
|
|
|
|
|
|
|
11 |
genai.configure(api_key=token)
|
12 |
|
13 |
generation_config = {
|
@@ -34,6 +43,7 @@ model = genai.GenerativeModel(
|
|
34 |
)
|
35 |
|
36 |
|
|
|
37 |
@app.route("/", methods=["GET", "POST"])
|
38 |
def index():
|
39 |
e = ""
|
@@ -43,19 +53,62 @@ def index():
|
|
43 |
else:
|
44 |
image_file = request.files["image"]
|
45 |
try:
|
46 |
-
|
|
|
|
|
47 |
|
48 |
-
response = model.generate_content([mm, image])
|
49 |
-
|
50 |
-
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
|
53 |
-
except Exception as e: # gérer les erreurs potentielles d'ouverture de l'image
|
54 |
-
e = f"Erreur lors du traitement de l'image : {str(e)}"
|
55 |
|
|
|
|
|
56 |
|
57 |
return render_template("index.html", e=e)
|
58 |
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
if __name__ == "__main__":
|
61 |
app.run(debug=True)
|
|
|
1 |
+
from flask import Flask, request, render_template, send_from_directory
|
2 |
import google.generativeai as genai
|
3 |
import os
|
4 |
from PIL import Image
|
5 |
import io
|
6 |
+
import subprocess
|
7 |
+
import uuid
|
8 |
+
import re
|
9 |
+
import tempfile
|
10 |
|
11 |
app = Flask(__name__)
|
12 |
+
app.config['UPLOAD_FOLDER'] = 'uploads'
|
13 |
+
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
|
14 |
|
15 |
# Configuration de l'API Gemini
|
16 |
token = os.environ.get("TOKEN")
|
17 |
+
if not token:
|
18 |
+
raise ValueError("La variable d'environnement TOKEN doit être définie.")
|
19 |
+
|
20 |
genai.configure(api_key=token)
|
21 |
|
22 |
generation_config = {
|
|
|
43 |
)
|
44 |
|
45 |
|
46 |
+
|
47 |
@app.route("/", methods=["GET", "POST"])
|
48 |
def index():
|
49 |
e = ""
|
|
|
53 |
else:
|
54 |
image_file = request.files["image"]
|
55 |
try:
|
56 |
+
with tempfile.NamedTemporaryFile(delete=False) as temp_img:
|
57 |
+
image_file.save(temp_img.name)
|
58 |
+
image = Image.open(temp_img.name)
|
59 |
|
60 |
+
response = model.generate_content([mm, image])
|
61 |
+
latex_code = response.text
|
62 |
+
os.remove(temp_img.name)
|
63 |
|
64 |
+
match = re.search(r"\\chemfig\{(.*?)\}", latex_code, re.DOTALL)
|
65 |
+
if match:
|
66 |
+
chemfig_code = match.group(1)
|
67 |
+
try:
|
68 |
+
with tempfile.TemporaryDirectory() as tmpdirname:
|
69 |
+
svg_filename = generate_svg_from_chemfig(chemfig_code, tmpdirname)
|
70 |
+
e = f'<img src="/uploads/{svg_filename}" alt="Structure chimique">'
|
71 |
+
except Exception as svg_error:
|
72 |
+
e = f"Erreur lors de la génération de l'image SVG : {str(svg_error)}"
|
73 |
+
elif any(keyword in latex_code.lower() for keyword in ['.pdf', '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.svg']):
|
74 |
+
e = "Désolé, les images et les PDF ne sont pas encore pris en charge dans la réponse."
|
75 |
+
else:
|
76 |
+
e = latex_code
|
77 |
|
|
|
|
|
78 |
|
79 |
+
except Exception as img_err:
|
80 |
+
e = f"Erreur lors du traitement de l'image: {str(img_err)}"
|
81 |
|
82 |
return render_template("index.html", e=e)
|
83 |
|
84 |
|
85 |
+
def generate_svg_from_chemfig(chemfig_code, tmpdirname):
|
86 |
+
unique_id = str(uuid.uuid4())
|
87 |
+
tex_filename = os.path.join(tmpdirname, f"chem_{unique_id}.tex")
|
88 |
+
pdf_filename = os.path.join(tmpdirname, f"chem_{unique_id}.pdf")
|
89 |
+
svg_filename = f"chem_{unique_id}.svg"
|
90 |
+
|
91 |
+
tex_content = f"""\\documentclass[margin=10pt]{{standalone}}
|
92 |
+
\\usepackage{{chemfig}}
|
93 |
+
\\begin{{document}}
|
94 |
+
\\chemfig{{{chemfig_code}}}
|
95 |
+
\\end{{document}}"""
|
96 |
+
|
97 |
+
with open(tex_filename, "w") as tex_file:
|
98 |
+
tex_file.write(tex_content)
|
99 |
+
|
100 |
+
try:
|
101 |
+
subprocess.run(["pdflatex", "-interaction=nonstopmode", tex_filename], check=True, cwd=tmpdirname)
|
102 |
+
subprocess.run(["pdf2svg", pdf_filename, os.path.join(app.config['UPLOAD_FOLDER'], svg_filename)], check=True)
|
103 |
+
return svg_filename
|
104 |
+
except subprocess.CalledProcessError as e:
|
105 |
+
raise Exception(f"Erreur lors de la compilation LaTeX ou de la conversion en SVG : {e}")
|
106 |
+
|
107 |
+
|
108 |
+
@app.route('/uploads/<filename>')
|
109 |
+
def uploaded_file(filename):
|
110 |
+
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
|
111 |
+
|
112 |
+
|
113 |
if __name__ == "__main__":
|
114 |
app.run(debug=True)
|