User:Vaxonian/sandbox

[page.title]

/*! terminal.js v2.0 | (c) 2014 Erik Österberg | https://github.com/eosterberg/terminaljs */

var Terminal = (function {	// PROMPT_TYPE	var PROMPT_INPUT = 1, PROMPT_PASSWORD = 2, PROMPT_CONFIRM = 3

var fireCursorInterval = function (inputField, terminalObj) { var cursor = terminalObj._cursor setTimeout(function {			if (inputField.parentElement && terminalObj._shouldBlinkCursor) {				cursor.style.visibility = cursor.style.visibility === 'visible' ? 'hidden' : 'visible'				fireCursorInterval(inputField, terminalObj)			} else {				cursor.style.visibility = 'visible'			}		}, 500) }

var firstPrompt = true; promptInput = function (terminalObj, message, PROMPT_TYPE, callback) { var shouldDisplayInput = (PROMPT_TYPE === PROMPT_INPUT) var inputField = document.createElement('input')

inputField.style.position = 'absolute' inputField.style.zIndex = '-100' inputField.style.outline = 'none' inputField.style.border = 'none' inputField.style.opacity = '0' inputField.style.fontSize = '0.2em'

terminalObj._inputLine.innerHTML = inputStartChar terminalObj._input.style.display = 'block' terminalObj.html.appendChild(inputField) fireCursorInterval(inputField, terminalObj)

if (message.length) terminalObj.print(PROMPT_TYPE === PROMPT_CONFIRM ? message + ' (y/n)' : message)

inputField.onblur = function { terminalObj._cursor.style.display = 'none' }

inputField.onfocus = function { inputField.value = terminalObj._inputLine.textContent terminalObj._cursor.style.display = 'inline' }

terminalObj.html.onclick = function { inputField.focus }

inputField.onkeydown = function (e) { if (e.which === 37 || e.which === 39 || e.which === 38 || e.which === 40 || e.which === 9) { e.preventDefault } else if (shouldDisplayInput && e.which !== 13) { setTimeout(function {				  if(inputField.value.length == 0) inputField.value = inputStartChar;					terminalObj._inputLine.innerHTML = inputField.value				}, 1) }		}		inputField.onkeyup = function (e) { if (PROMPT_TYPE === PROMPT_CONFIRM || e.which === 13) { terminalObj._input.style.display = 'none' var inputValue = inputField.value if (shouldDisplayInput) terminalObj.print(inputValue) terminalObj.html.removeChild(inputField) if (typeof(callback) === 'function') { if (PROMPT_TYPE === PROMPT_CONFIRM) { callback(inputValue.toUpperCase[0] === 'Y' ? true : false) } else callback(inputValue.slice(inputStartChar.length)) }			}		}		if (firstPrompt) { firstPrompt = false setTimeout(function { inputField.focus	}, 50) } else { inputField.focus }	}

var terminalBeep

var TerminalConstructor = function (id) { /*if (!terminalBeep) { terminalBeep = document.createElement('audio') var source = '' + source + 'ogg" type="audio/ogg">'			terminalBeep.volume = 0.05		}*/

this.html = document.createElement('div') this.html.className = 'Terminal' if (typeof(id) === 'string') { this.html.id = id }

this._innerWindow = document.createElement('div') this._output = document.createElement('p') this._inputLine = document.createElement('span') //the span element where the users input is put this._cursor = document.createElement('span') this._input = document.createElement('p') //the full element administering the user input, including cursor

this._shouldBlinkCursor = true

this.beep = function { terminalBeep.load terminalBeep.play }

this.print = function (message) { var newLine = document.createElement('div') newLine.innerHTML = message this._output.appendChild(newLine) }

this.input = function (message, callback) { promptInput(this, message, PROMPT_INPUT, callback) }

this.password = function (message, callback) { promptInput(this, message, PROMPT_PASSWORD, callback) }

this.confirm = function (message, callback) { promptInput(this, message, PROMPT_CONFIRM, callback) }

this.clear = function { this._output.innerHTML = '' }

this.sleep = function (milliseconds, callback) { setTimeout(callback, milliseconds) }

this.setTextSize = function (size) { this._output.style.fontSize = size this._input.style.fontSize = size }

this.setTextColor = function (col) { this.html.style.color = col this._cursor.style.background = col }

this.setBackgroundColor = function (col) { this.html.style.background = col }

this.setWidth = function (width) { this.html.style.width = width }

this.setHeight = function (height) { this.html.style.height = height }

this.blinkingCursor = function (bool) { bool = bool.toString.toUpperCase this._shouldBlinkCursor = (bool === 'TRUE' || bool === '1' || bool === 'YES') }

this._input.appendChild(this._inputLine) this._input.appendChild(this._cursor) this._innerWindow.appendChild(this._output) this._innerWindow.appendChild(this._input) this.html.appendChild(this._innerWindow)

this.setBackgroundColor('black') this.setTextColor('white') this.setTextSize('1em') this.setWidth('100%') this.setHeight('100%')

this.html.style.fontFamily = 'Monaco, Courier' this.html.style.margin = '0' this._innerWindow.style.padding = '10px' this._input.style.margin = '0' this._output.style.margin = '0' this._cursor.style.background = 'white' this._cursor.innerHTML = 'C' //put something in the cursor.. this._cursor.style.display = 'none' //then hide it		this._input.style.display = 'none' }

return TerminalConstructor });

 .Terminal { overflow-y: auto; }	.Terminal > div div { white-space: pre-wrap; }	body { background-color: black; text-shadow: 0 0 5px #C8C8C8; }	#fuzzy-overlay { z-index:3; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15) 1px, transparent 1px, transparent 2px); pointer-events: none; }

background: #0080FF; text-shadow: none; }

pre { margin: 0; }

let history = []; let historyIndex = -1; window.addEventListener('resize', e => {	 terminal.setHeight(window.innerHeight+"px");	}); window.addEventListener('keyup', e => {	 if(e.which === 13) setTimeout( => document.querySelector(".Terminal").scrollTop = 999999999, 10);	}); window.addEventListener('keydown', e => {	 if(historyIndex === -1 || (e.which !== 38 && e.which !== 40)) return;		let dir = e.which === 38 ? 'up' : 'down';		if(dir === 'down' && historyIndex === history.length-1) return;		if(dir === 'up' && historyIndex === 0) return;		historyIndex = dir === 'up' ? historyIndex-1 : historyIndex+1;		document.querySelector("#mainCtn .Terminal > div > p:last-child > span").textContent = inputStartChar+history[historyIndex];		document.querySelector("#mainCtn .Terminal > input").value = inputStartChar+history[historyIndex];	});

let terminal = new Terminal; mainCtn.appendChild(terminal.html); (async function {	 let printTmp = terminal.print.bind(terminal);		terminal.print = function(text) {		  text = (text+"");			text = text.replace(/ /g, "\n");			text = text.replace(/\\n/g, "\n");      printTmp(text);		}	  terminal.setTextSize(page.font.size+"em");		terminal.setTextColor(page.font.color);		terminal.setHeight(window.innerHeight+"px");	  terminal.setBackgroundColor(page.background.color);		console.log(page.glow, document.querySelector("#mainCtn .Terminal"));		if(page.glow !== "none") document.querySelector("#mainCtn .Terminal").style.backgroundImage = `radial-gradient(${page.glow},black 120%)`;	  terminal.print(welcome);	  while(1) {      await new Promise((resolve, reject) => { terminal.input("", function (userInput) {				 if(history[history.length-1] !== userInput && userInput.trim) history.push(userInput);					if(history.length > 500) history.slice(-450);					historyIndex = history.length;				  if(userInput.trim === "") {						terminal.print(" ");					  resolve;					  return;					}				  if(userInput.trim === "help") {					  let maxLength = Math.max(...commands.selectAll.map(c => c.getName.length));					  terminal.print("Here are the available commands:\n"+commands.selectAll.map(c => `  ${c.getName.padEnd(maxLength)}    ${c.description}`).join("\n"));						resolve;						return;					}					window.command = userInput.split(/\s+/)[0];					if(userInput.indexOf(" ") !== -1) window.input = userInput.slice(userInput.indexOf(" ")+1);					else window.input = "";					// print result of command:					let result = commands[command];          terminal.print(result === undefined ? errors.commandNotFound : result.output);					resolve;       }); })		}	}); document.querySelector("#mainCtn .Terminal").focus; function beepFn { var snd = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); snd.play; return ""; }	window.beep = {}; window.beep.toString = beepFn; function clearFn { terminal.clear; return ""; }	window.clear = {}; window.clear.toString = clearFn;