88 lines
1.6 KiB
JavaScript
88 lines
1.6 KiB
JavaScript
var TERM_INTERVAL = 0;
|
|
var buffer = "";
|
|
var content;
|
|
|
|
const banner =
|
|
`OpenTerminal v0.1.0
|
|
made with <3 by ari melody
|
|
|
|
`;
|
|
|
|
function start() {
|
|
content = document.getElementById("content");
|
|
send_text(banner);
|
|
loop();
|
|
}
|
|
|
|
function loop() {
|
|
if (buffer.length > 0) {
|
|
const carat = content.querySelector("#carat");
|
|
if (carat) carat.remove();
|
|
|
|
const char = buffer.slice(0, 1);
|
|
if (char == "\b") {
|
|
content.innerText = content.innerText.slice(0, content.innerText.length - 1);
|
|
} else {
|
|
content.innerText += char;
|
|
}
|
|
buffer = buffer.slice(1);
|
|
|
|
const new_carat = document.createElement("div");
|
|
new_carat.id = "carat";
|
|
content.appendChild(new_carat);
|
|
}
|
|
|
|
setTimeout(loop, TERM_INTERVAL);
|
|
}
|
|
|
|
function handle_input(event) {
|
|
// console.debug(event.key);
|
|
|
|
if (event.key == "Backspace") {
|
|
if (event.ctrlKey) {
|
|
const last_space = content.innerText.lastIndexOf(" ");
|
|
const last_newline = content.innerText.lastIndexOf("\n");
|
|
|
|
var break_at = last_space;
|
|
if (last_newline > last_space) {
|
|
break_at = last_newline;
|
|
}
|
|
|
|
const word_length = content.innerText.length - break_at;
|
|
send_text("\b".repeat(word_length));
|
|
return;
|
|
}
|
|
send_text("\b");
|
|
return;
|
|
}
|
|
if (event.key.startsWith("Arrow")) {
|
|
return;
|
|
}
|
|
switch (event.key) {
|
|
case 'Shift':
|
|
case 'Control':
|
|
case 'Alt':
|
|
return;
|
|
case 'Enter':
|
|
send_text('\n');
|
|
break;
|
|
}
|
|
if (event.key.length > 1) {
|
|
return;
|
|
}
|
|
|
|
send_text(event.key);
|
|
}
|
|
|
|
function send_text(char) {
|
|
content.scrollTop = content.scrollHeight;
|
|
buffer += char;
|
|
}
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
start();
|
|
});
|
|
|
|
document.addEventListener("keydown", handle_input);
|
|
|