from http.server import BaseHTTPRequestHandler, HTTPServer from urllib.parse import parse_qs import subprocess as sp import os def page(src="", content=""): return f""" Noja Diagram Server

{content}
""" class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(page().encode('utf-8')) def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length).decode('utf-8') parsed_data = parse_qs(post_data) self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() if 'message' not in parsed_data: self.wfile.write(page().encode('utf-8')) return message = parsed_data['message'][0] src = "/tmp/src.noja" tmp = "/tmp/tmp.dot" dst = "/tmp/dst.svg" open(src, "wb").write(bytes(message, 'ascii')) cmd = f"noja --diagram-ast -o {tmp} {src}" output = sp.Popen(cmd, shell=True, stderr=sp.PIPE).stderr.read().decode('utf-8') if not os.path.isfile(tmp): self.wfile.write(page(message, output).encode('utf-8')) return cmd = f"dot -Tsvg -o {dst} {tmp}" output = sp.Popen(cmd, shell=True, stdout=sp.PIPE).stdout.read().decode('utf-8') if not os.path.isfile(dst): self.wfile.write(page(message, output).encode('utf-8')) return svg = open(dst, "rb").read().decode('utf-8') os.remove(src) os.remove(tmp) os.remove(dst) self.wfile.write(page(message, svg).encode('utf-8')) def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f"Server avviato su http://localhost:{port}") httpd.serve_forever() if __name__ == '__main__': run()