Files
gride/client/index.js

167 lines
4.5 KiB
JavaScript
Raw Normal View History

2025-09-25 22:16:05 +10:00
let textbox;
2025-09-25 09:07:44 +10:00
let textconsole;
2025-09-25 11:34:38 +10:00
let text = '# welcome to gride! start typing to code a program in Ground!\n';
let filebutton;
let fileinput;
function renderHighlightedText() {
let renderedText = "";
const lines = text.split("\n");
for (const line of lines) {
iscomment = false;
renderedText += "<p>";
const tokens = line.split(" ");
for (const token of tokens) {
renderedText += highlightToken(token) + " ";
}
renderedText += "</p>";
instring = false;
}
textbox.innerHTML = renderedText;
}
2025-09-25 22:16:05 +10:00
// Wait for the window to load before doing anything
window.addEventListener("load", function() {
2025-09-25 11:34:38 +10:00
// Get all the elements
2025-09-25 22:16:05 +10:00
textbox = document.getElementById("editor");
2025-09-25 09:07:44 +10:00
textconsole = document.getElementById("console");
2025-09-25 11:34:38 +10:00
textbox.innerText = text;
filebutton = document.getElementById('buttonTrigger');
fileinput = document.getElementById('fileInput');
// Set up watchers for everything
filebutton.addEventListener('click', () => {
fileinput.click();
})
fileinput.addEventListener('change', () => {
const file = fileinput.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
text = e.target.result;
textbox.innerText = text;
renderHighlightedText();
};
reader.readAsText(file);
} else {
console.log("what");
}
});
2025-09-25 22:16:05 +10:00
});
2025-09-25 11:34:38 +10:00
const keywords = ["if", "jump", "end", "input", "stdin", "print", "stdout", "println", "stdlnout", "set", "gettype", "exists", "setlist", "setlistat", "getlistat", "getlistsize", "listappend", "getstrsize", "getstrcharat", "add", "subtract", "multiply", "divide", "equal", "inequal", "not", "greater", "lesser", "stoi", "stod", "tostring", "fun", "return", "endfun", "pusharg", "call", "struct", "endstruct", "init", "use", "extern", "catch"];
const colours = {
keyword: "#42fff2",
comment: "#383838",
number: "#42ffb7",
string: "#42ff62",
valref: "#9544c7",
dirref: "#f587ff",
label: "#fff67d",
function: "#ffa640",
typeref: "#ff40ac"
}
let instring = false;
let iscomment = false;
// Function to handle highlighting tokens that have been typed
function highlightToken(token) {
if (instring) {
if (token[token.length - 1] == '"' || token[token.length - 1] == '"') {
instring = false;
}
return `<span style="color: ${colours.string}">${token}</span>`
}
// Comments
if (iscomment) {
return `<span style="color: ${colours.comment}"> ${token}</span>"`
}
if (token[0] == '#') {
iscomment = true;
return `<span style="color: ${colours.comment}> ${token}</span>"`
}
// Keywords
if (keywords.includes(token)) {
return `<span style="color: ${colours.keyword}">${token}</span>`;
}
// Direct references
if (token[0] == '&') {
return `<span style="color: ${colours.dirref}">${token}</span>`;
}
// Value references
if (token[0] == '$') {
return `<span style="color: ${colours.valref}">${token}</span>`;
}
// Strings and characters
if (token[0] == '"' || token[0] == "'") {
if (!(token[token.length - 1] == '"' || token[token.length - 1] == '"')) {
instring = true;
}
return `<span style="color: ${colours.string}">${token}</span>`;
}
return `<span>${token}</span>`;
}
2025-09-25 22:16:05 +10:00
// When we press a key, start doing stuff
2025-09-25 11:34:38 +10:00
textbox.addEventListener('input', () => {
text = textbox.innerText;
renderHighlightedText();
});
// Old code
/*
2025-09-25 22:16:05 +10:00
onkeydown = (event) => {
if (event.key == "Enter") {
2025-09-25 11:34:38 +10:00
//text += "</p>\n<p>";
text += "\n"
2025-09-25 22:16:05 +10:00
} else if (event.key == "Tab") {
text += " ";
} else if (event.key == "Backspace") {
2025-09-25 11:34:38 +10:00
text = text.slice(0, -1)
2025-09-25 22:16:05 +10:00
} else if (!(event.key == "Control" || event.key == "Alt" || event.key == "Meta" || event.key == "Shift" || event.key == "Escape")) {
text += event.key;
}
2025-09-25 11:34:38 +10:00
let renderedText = "";
const lines = text.split("\n");
for (const line of lines) {
renderedText += "<p>";
const tokens = line.split(" ");
for (const token of tokens) {
renderedText += highlightToken(token) + " ";
}
renderedText += "</p>";
instring = false;
iscomment = false;
}
textbox.innerHTML = renderedText;
2025-09-25 22:16:05 +10:00
}
2025-09-25 11:34:38 +10:00
*/
2025-09-25 22:16:05 +10:00
2025-09-25 11:34:38 +10:00
// Function to run code on the server
2025-09-25 22:16:05 +10:00
async function runCode() {
console.log(text.split("<p>").join("").split("</p>").join(""));
const result = await fetch("http://localhost:5000/runProgram", {
"method": "POST",
//"mode": "no-cors",
"body": text.split("<p>").join("").split("</p>").join("")
});
const data = await result.json();
2025-09-25 11:34:38 +10:00
// Ensure everything's seperated
textconsole.innerHTML = "<p>" + data.stdout.split("\n").join("</p><p>") + "</p>";
2025-09-25 22:16:05 +10:00
}