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 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user