diff --git a/js/terminal.js b/js/terminal.js index 24939df..a92570c 100644 --- a/js/terminal.js +++ b/js/terminal.js @@ -200,3 +200,207 @@ var Terminal = Terminal || function(cmdLineContainer, outputContainer) { output: output } }; +var util = util || {}; +util.toArray = function(list) { + return Array.prototype.slice.call(list || [], 0); +}; + +function show_image(src, width, height, alt) { + var img = document.createElement("img"); + img.src = src; + img.width = width; + img.height = height; + img.alt = alt; + + // This next line will just add it to the
tag + document.body.appendChild(img); +} + +var Terminal = Terminal || function(cmdLineContainer, outputContainer) { + window.URL = window.URL || window.webkitURL; + window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; + + var cmdLine_ = document.querySelector(cmdLineContainer); + var output_ = document.querySelector(outputContainer); + + const CMDS_ = [ + 'cat', 'clear', 'clock', 'date', 'echo', 'help', 'uname', 'whoami' + ]; + + var fs_ = null; + var cwd_ = null; + var history_ = []; + var histpos_ = 0; + var histtemp_ = 0; + + window.addEventListener('click', function(e) { + cmdLine_.focus(); + }, false); + + cmdLine_.addEventListener('click', inputTextClick_, false); + cmdLine_.addEventListener('keydown', historyHandler_, false); + cmdLine_.addEventListener('keydown', processNewCommand_, false); + + // + function inputTextClick_(e) { + this.value = this.value; + } + + // + function historyHandler_(e) { + if (history_.length) { + if (e.keyCode == 38 || e.keyCode == 40) { + if (history_[histpos_]) { + history_[histpos_] = this.value; + } else { + histtemp_ = this.value; + } + } + + if (e.keyCode == 38) { // up + histpos_--; + if (histpos_ < 0) { + histpos_ = 0; + } + } else if (e.keyCode == 40) { // down + histpos_++; + if (histpos_ > history_.length) { + histpos_ = history_.length; + } + } + + if (e.keyCode == 38 || e.keyCode == 40) { + this.value = history_[histpos_] ? history_[histpos_] : histtemp_; + this.value = this.value; // Sets cursor to end of input. + } + } + } + + // + function processNewCommand_(e) { + + if (e.keyCode == 9) { // tab + e.preventDefault(); + // Implement tab suggest. + } else if (e.keyCode == 13) { // enter + // Save shell history. + if (this.value) { + history_[history_.length] = this.value; + histpos_ = history_.length; + } + + // Duplicate current input and append to output section. + var line = this.parentNode.parentNode.cloneNode(true); + line.removeAttribute('id') + line.classList.add('line'); + var input = line.querySelector('input.cmdline'); + input.autofocus = false; + input.readOnly = true; + output_.appendChild(line); + + if (this.value && this.value.trim()) { + var args = this.value.split(' ').filter(function(val, i) { + return val; + }); + var cmd = args[0].toLowerCase(); + args = args.splice(1); // Remove cmd from arg list. + } + + switch (cmd) { + case 'cat': + var url = args.join(' '); + if (!url) { + output('Usage: ' + cmd + ' https://s.codepen.io/...'); + output('Example: ' + cmd + ' https://s.codepen.io/AndrewBarfield/pen/LEbPJx.js'); + break; + } + $.get( url, function(data) { + var encodedStr = data.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { + return ''+i.charCodeAt(0)+';'; + }); + output('' + encodedStr + ''); + }); + break; + case 'clear': + output_.innerHTML = ''; + this.value = ''; + return; + case 'clock': + var appendDiv = jQuery($('.clock-container')[0].outerHTML); + appendDiv.attr('style', 'display:inline-block'); + output_.appendChild(appendDiv[0]); + break; + case 'date': + output( new Date() ); + break; + case 'echo': + output( args.join(' ') ); + break; + case 'help': + output('
' + html + '
'); + } + + // Cross-browser impl to get document's height. + function getDocHeight_() { + var d = document; + return Math.max( + Math.max(d.body.scrollHeight, d.documentElement.scrollHeight), + Math.max(d.body.offsetHeight, d.documentElement.offsetHeight), + Math.max(d.body.clientHeight, d.documentElement.clientHeight) + ); + } + + // + return { + init: function() { + output('' + new Date() + '
Enter "help" for more information.
'); + }, + output: output + } +};