added permalinked files
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 12 Mar 2022 22:03:02 +0000 (16:03 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 12 Mar 2022 22:03:02 +0000 (16:03 -0600)
clean_permalinked.py [new file with mode: 0644]
serve.py
static/css/index.css
static/src/index.js
templates/index.html

diff --git a/clean_permalinked.py b/clean_permalinked.py
new file mode 100644 (file)
index 0000000..71b2903
--- /dev/null
@@ -0,0 +1,6 @@
+import os, time
+
+for f in os.listdir("./permalinked"):
+    full_path = os.path.join("./permalinked", f)
+    if os.path.getctime(full_path) + 60 * 60 * 24 * 60 < time.gmtime():
+        os.remove(full_path)
index c4a89d45ed7b41e32093495b6697a3bf23e1e417..30c13ed92f26cadd7f40b6d4b15395d6c93778e6 100644 (file)
--- a/serve.py
+++ b/serve.py
@@ -15,7 +15,15 @@ def require_coep(response):
 
 @app.route("/")
 def get_homepage():
-    response = flask.Response(flask.render_template("index.html"))
+    code_body = """#load "core/std"
+
+use package core
+
+main :: (args: [] cstr) {
+    println("Hello, Onyx!");
+}"""
+
+    response = flask.Response(flask.render_template("index.html", code_body=code_body))
     response.headers['Cross-Origin-Embedder-Policy'] = "require-corp"
     response.headers['Cross-Origin-Opener-Policy'] = "same-origin"
     return response
@@ -68,3 +76,34 @@ def post_compile_onyx():
     else:
         return compile_process.stdout, 500
 
+@app.route("/permalink", methods=['POST'])
+def create_permalink():
+    import tempfile, os
+
+    code = request.json['code']
+    code_file_desc, code_file_name = tempfile.mkstemp(prefix="", dir="./permalinked")
+    with os.fdopen(code_file_desc, "w+b") as code_file:
+        code_file.write(code.encode('utf-8'))
+
+    _, link_id = os.path.split(code_file_name)
+
+    response = {}
+    response["id"] = link_id
+    response["url"] = app.config["DOMAIN_NAME"] + "/" + link_id
+    return response, 200
+
+@app.route("/<string:link>")
+def get_permalinked(link):
+    import os
+    path = os.path.join("./permalinked", link)
+
+    code_body = ""
+    if os.path.isfile(path):
+        with open(path) as f:
+            code_body = f.read()
+
+    response = flask.Response(flask.render_template("index.html", code_body=code_body))
+    response.headers['Cross-Origin-Embedder-Policy'] = "require-corp"
+    response.headers['Cross-Origin-Opener-Policy'] = "same-origin"
+    return response
+
index 3fb267759dc3edc20d674dbf7189093a825d1368..f6f4c831b63ae2d57c7cd1d4e5e8c2bcd326a5e3 100644 (file)
@@ -212,6 +212,11 @@ select:hover {
     cursor: pointer;
 }
 
+.modal button:disabled {
+    background: var(--dark-background-color);
+    cursor: not-allowed;
+}
+
 .modal .file-list {
     max-height: 400px;
     overflow: auto;
index 51b7f860d617be813c583cbc56bf4718540555fa..6c7e87ec46a46d9e6f2c6802373eee9b1248d739 100644 (file)
@@ -260,6 +260,27 @@ function load_example() {
     });
 }
 
+async function request_permalink() {
+    let editor = ace.edit('code-editor');
+    let code = editor.getValue();
+
+    let response = await fetch(window.ROOT_ENDPOINT + "/permalink", {
+        method: 'POST',
+        cache:  'no-cache',
+        headers: {
+            'Content-Type': 'application/json',
+        },
+        body:   JSON.stringify({ code }),
+    });
+
+    if (response.status == 200) {
+        let res = await response.json();
+        console.log(res);
+        $("#permalink").html(`Permalink created: <a target="_blank" href="${res.url}">${res.url}</a>`);
+        $("#permalink + button").prop("disabled", "true");
+    }
+}
+
 window.onload = () => {
     let editor = ace.edit('code-editor');
 
index 7802ae503fe3829956bb2997ecc0ba7aa81e28e1..e90fc57bf29e51576cebea4372025d3077be098a 100644 (file)
         </div>
 
         <div class="left-half">
-            <pre id="code-editor" ondragover="handle_dragover(event);" ondrop="handle_drop(event);">
-#load "core/std"
-
-use package core
-
-main :: (args: [] cstr) {
-    println("Hello, Onyx!");
-}</pre>
+            <pre id="code-editor" ondragover="handle_dragover(event);" ondrop="handle_drop(event);">{{ code_body }}</pre>
         </div>
 
         <div id="horizontal-divider" class="divider"></div>
@@ -97,7 +90,14 @@ main :: (args: [] cstr) {
         </div>
 
         <div id="save-modal" class="modal">
-            <h2>Save</h2>
+            <h2>Save Online</h2>
+            <div>
+                <span style="margin: 8px 0;" id="permalink">Permalink not created.</span>
+                <button style="float: right; padding: 0 8px;" onclick="request_permalink()">Create permalink</button>
+            </div>
+
+            <br/>
+            <h2>Save Locally</h2>
             <input type="text" id="save-filename" name="save-filename" placeholder="Name" />
             <br/>
             <button onclick="save_to_local_storage()">Save</button>