add diagram server script
This commit is contained in:
@@ -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
@@ -157,11 +157,13 @@ int main(int argc, char **argv)
|
||||
Error error;
|
||||
Error_Init(&error);
|
||||
|
||||
int error_offset;
|
||||
|
||||
char *result;
|
||||
if (no_file)
|
||||
result = diagramStringAST(input, &error, NULL);
|
||||
result = diagramStringAST(input, &error, &error_offset);
|
||||
else
|
||||
result = diagramFileAST(input, &error, NULL);
|
||||
result = diagramFileAST(input, &error, &error_offset);
|
||||
|
||||
if (!result) {
|
||||
Error_Print(&error, ErrorType_UNSPECIFIED, stderr);
|
||||
|
||||
Reference in New Issue
Block a user