@app.route("/manifest.json")
def get_manifest():
- return send_file("static/manifest.json", mimetype="application/json")
\ No newline at end of file
+ return send_file("static/manifest.json", mimetype="application/json")
+
+@app.route("/core_libraries.json")
+def get_core_libraries():
+ import json
+ import os
+
+ def read_file(f):
+ with open(f) as file:
+ return file.read()
+
+ def build_dir(d):
+ filenames = [f for f in os.listdir(d) if os.path.isfile(os.path.join(d, f))]
+ dirnames = [f for f in os.listdir(d) if os.path.isdir(os.path.join(d, f))]
+
+ out = []
+ out += [{
+ "name": name,
+ "type": "dir",
+ "state": "closed",
+ "elems": build_dir(os.path.join(d, name))
+ } for name in dirnames]
+
+ out += [{
+ "name": name,
+ "type": "file",
+ "contents": read_file(os.path.join(d, name))
+ } for name in filenames]
+
+ return out
+
+
+ output = build_dir("./core_libraries")
+
+ response = flask.Response(json.dumps(output), mimetype="application/json")
+ return response
\ No newline at end of file
// Experimental Folder System
-/*
- {
- "name": "Examples",
- "type": "dir",
- "state": "open",
- "elems": [
- {
- "name": "example 1",
- "type": "file",
- },
- {
- "name": "example 2",
- "type": "file",
- },
- {
- "name": "example 3",
- "type": "file",
- },
- {
- "name": "Built ins",
- "type": "dir",
- "state": "open",
- "elems": [
- {
- "name": "example 1",
- "type": "file",
- },
- {
- "name": "example 2",
- "type": "file",
- },
- {
- "name": "example 3",
- "type": "file",
- },
- ],
- },
- ],
- },
- {
- "name": "Built ins",
- "type": "dir",
- "state": "open",
- "elems": [
- {
- "name": "example 1",
- "type": "file",
- },
- {
- "name": "example 2",
- "type": "file",
- },
- {
- "name": "example 3",
- "type": "file",
- },
- ],
- },
-]
-*/
-
class FolderSystem {
constructor() {
this.folders = [];
+ this.active_file_path = "";
}
create_directory(path) {
move_file(old_path, new_path) {
let existing = this.lookup(old_path);
+
+ if (existing == null) return;
+
+ if (existing.type == "file") {
+ this.remove(old_path);
+ this.create_file(new_path, existing.contents);
+ } else {
+ let dirname = new_path.substring(new_path.lastIndexOf("/") + 1);
+ existing.name = dirname;
+ }
}
build_folder_view(onclick, selector=".folder-root") {
let output = "";
switch (t.type) {
case "dir": {
- output += `<div class="folder-item directory ${t.state}" data-filename="${name}">
- <i class="fa ${t.state == "open" ? "fa-folder-open" : "fa-folder"}"></i>
- ${t.name}
- <i class="folder-item-button fa fa-trash"></i>
- <i class="folder-item-button fa fa-pencil-alt"></i>
- </div>`;
-
t.elems.sort((a, b) => {
let av = a.type == "dir" ? 0 : 1;
let bv = b.type == "dir" ? 0 : 1;
if (av == bv) {
- return a.name < b.name ? -1 : 1;
+ return a.name.localeCompare(b.name);
} else {
return av - bv;
}
})
- output += `<div class="folder ${t.state == "closed" ? "hidden" : ""}">`;
- for (let i of t.elems) {
- output += build(i, name + "/" + i.name);
+ if (name != undefined) {
+ output += `<div class="folder-item directory ${t.state}" data-filename="${name}">
+ <i class="fa ${t.state == "open" ? "fa-folder-open" : "fa-folder"}"></i>
+ ${t.name}
+ <i class="folder-item-button fa fa-trash"></i>
+ <i class="folder-item-button fa fa-pencil-alt"></i>
+ </div>`;
+
+ output += `<div class="folder ${t.state == "closed" ? "hidden" : ""}">`;
+ for (let i of t.elems) {
+ output += build(i, name + "/" + i.name);
+ }
+ output += `</div>`;
+ } else {
+ for (let i of t.elems) {
+ output += build(i, i.name);
+ }
}
- output += `</div>`;
break;
}
return output;
}
- let root_html = "";
- for (let elem of this.folders) {
- root_html += build(elem, elem.name);
- }
+ let root = {type:"dir", elems:this.folders};
+ let root_html = build(root);
$root.html(root_html);
$root.find(".folder-item").click(onclick);
}
}
-
async function enable_ide_mode() {
$("#simple-menubar").addClass("hidden");
$("#ide-menubar").removeClass("hidden");
await populate_examples_folder();
}
+ if (folders.lookup("Core Libraries") == null) {
+ await populate_core_libraries_folder();
+ }
+
await populate_simple_saved_folder();
folders.save();
}
}
+async function populate_core_libraries_folder() {
+ let core_libs = await fetch(ROOT_ENDPOINT + "/core_libraries.json").then(x => x.json())
+ let core_dir = folders.create_directory("Core Libraries");
+ core_dir.elems = core_libs;
+}
+
function folder_item_click(e) {
let $target = $(e.target);
}
if ($target.hasClass("directory")) {
+ let dirname = $target.attr("data-filename");
+ let dir = folders.lookup(dirname);
+
if ($target.hasClass("open")) {
$target.removeClass("open").addClass("closed");
$target.children("i").removeClass("fa-folder-open").addClass("fa-folder");
$target.next().addClass("hidden");
+ dir.state = "closed";
} else {
$target.removeClass("closed").addClass("open");
$target.children("i").removeClass("fa-folder").addClass("fa-folder-open");
$target.next().removeClass("hidden");
+ dir.state = "open";
}
}
}
function folder_open_file(filename) {
let editor = ace.edit("code-editor");
+ if (folders.active_file_path != "") {
+ let file = folders.lookup(folders.active_file_path);
+ if (file != null) {
+ file.contents = editor.getValue();
+ folders.save();
+ }
+ }
+
let file = folders.lookup(filename);
editor.setValue(file.contents);
editor.clearSelection();
+ folders.active_file_path = filename;
}
function folder_start_create_file() {
$.modal.close();
}
+function folder_save_current_file() {
+ let editor = ace.edit("code-editor");
+ if (folders.active_file_path != "") {
+ let file = folders.lookup(folders.active_file_path);
+ if (file != null) {
+ file.contents = editor.getValue();
+ folders.save();
+ }
+ }
+}
\ No newline at end of file