add diagram server script

This commit is contained in:
Francesco Cozzuto
2024-01-01 20:59:01 +01:00
parent 7a8a5bdfa0
commit f5d8df3147
2 changed files with 134 additions and 2 deletions
+130
View File
@@ -0,0 +1,130 @@
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs
import subprocess as sp
import os
def page(src="", content=""):
return f"""
<html>
<head>
<meta charset="utf-8" />
<title>Noja Diagram Server</title>
<style>
* {{
margin: 0;
padding: 0;
outline: 0;
}}
body {{
width: 100%;
height: 100%;
}}
#left-panel,
#right-panel {{
width: calc(50% - 20px);
height: calc(100% - 20px);
float: left;
padding: 10px;
}}
#controls {{
width: 100%;
height: 30px;
overflow: auto;
}}
textarea {{
width: 100%;
height: calc(100% - 40px);
padding: 10px;
margin-top: 10px;
font-size: 28px;
}}
input {{
height: 30px;
padding: 0 10px;
float: right;
}}
#left-panel {{
background-color: #eee;
}}
#right-panel {{
overflow: auto;
}}
svg {{
margin: auto 100px;
}}
</style>
</head>
<body>
<div id="left-panel">
<form method="post" action="/">
<div id="controls">
<input type="submit" value="Draw AST">
</div>
<textarea id="message" name="message" rows="4" cols="50" placeholder="[Noja code goes here!]">{src}</textarea><br>
</form>
</div>
<div id="right-panel">
{content}
</div>
</body>
</html>
"""
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()
+4 -2
View File
@@ -157,11 +157,13 @@ int main(int argc, char **argv)
Error error; Error error;
Error_Init(&error); Error_Init(&error);
int error_offset;
char *result; char *result;
if (no_file) if (no_file)
result = diagramStringAST(input, &error, NULL); result = diagramStringAST(input, &error, &error_offset);
else else
result = diagramFileAST(input, &error, NULL); result = diagramFileAST(input, &error, &error_offset);
if (!result) { if (!result) {
Error_Print(&error, ErrorType_UNSPECIFIED, stderr); Error_Print(&error, ErrorType_UNSPECIFIED, stderr);